我想用一个单独的域作为一个JavaScript框架,它会创建一个基本的要求配置,我可以从应用程序增加。
foo.example.com
main.js
lib/foo-specific.js
framework.example.com
framework.js <-- entry point
lib/jquery.js
lib/etc...
理想情况下,我希望能够要求“的lib / foo的特定”和/或“的lib / jQuery的”,并有路径只是很好地解决,但我学到了什么,有没有办法做到这一点,除非我用一个特定的路径键/值在每一个框架js文件。 目前,我有一个自定义插件具有不同的基本URL来加载指定的路径(例如fw!lib/jquery
),但如果我想使用text!
插件,它不会工作作为插件链接不受支持。
见https://github.com/jpillora/js-framework什么我目前得到的,也https://github.com/jpillora/prettyprinter的使用情况。
有没有办法解决这个问题一个干净的方式? 或实现多个基站网址?
注:我也看了成多个要求的情况下,虽然我不认为这工作,因为我想在应用程序能够访问到框架中的配置。
由詹姆斯·伯克RequireJS Github上发行的页面上回答: 问题#447:多个基本URL·jrburke / requirejs 。
真可谓是相当简单的,如果数据主要是唯一的入口点脚本(更多信息评论),我解决我的具体问题有以下几点:
我的应用程序的index.html
:
<script src="http://framework.jpillora.com/js/lib/require.js"
data-main="http://framework.jpillora.com/js/framework" > </script>
有requirejs入口点设置为framework.js
:
var framework = ... //set using script elements src attribute
require.config({
baseUrl: 'js/',
//Framework paths
paths: {
'framework': framework,
'lib' : framework + 'js/lib',
'ext' : framework + 'js/ext',
'util' : framework + 'js/util'
},
//Shortcuts
map: {
'*': {
...
}
},
//Non-modularised libraries with deps
shim: {
...
}
});
require(['main']);
因此,而不是通常做index.html->main.js
,我们增加一个额外的步骤index.html->framework.js->main.js
,这给路径的应用程序代码的知识框架代码。
例如,在应用http://prettyprint.jpillora.com/ ,一旦需要加载framework.js
,它会安装路径lib/...
其中http://framework.jpillora.com/并设置baseUrl
为./js/
所以一旦main
是必需的,这将有基本URL设置为它自己的域名和lib
指向另一个域。
这导致require(['lib/foo', 'view/bar']);
解析为:
http://framework.jpillora.com/js/lib/foo.js
和http://prettyprint.jpillora.com/js/view/bar.js
由于此处显示的应用程序仅仅是一个main.js
一切来自于framework
:
所以最后,每当我加载应用程序的main.js
通过上述framework.js
,我则有机会获得我所有的常用库和工具类。 见附录源。
还要注意,与r.js
优化器和一个不错的本地文件结构,还可以优化应用到一个单一的js文件只什么需要从拉framework
。
问题
而试图建立一个测试环境我有一个类似的问题。 我有过这样的文件结构:
myApp/
src/
js/
app.js
data.js
lib/underscore.js
test/
karma.conf.js
test-main.js
matchers.js
spec/
data.js
这里的地方变得棘手:我的应用程序的脚本( app.js
和data.js
)承担RequireJS配置解析data
到src/js/data.js
, lib/underscore
来src/js/lib/underscore.js
等,所以我需要在我的测试环境,配置以及:
test/test-main.js
-----------------
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: '/base/src/js',
// ...
});
现在,我可以写我的测试:
test/spec/data.js
-----------------
define(['data', '../../test/matchers'], function(dataModule) {
describe('The data module', function() {
it('should satisfy my custom matcher', function() {
expect(dataModule).toSatisfyMyCustomMatcher();
});
});
});
随着一些自定义的匹配:
test/matchers.js
----------------
define([], function() {
beforeEach(function() {
this.addMatchers({
toSatisfyMyCustomMatcher: function() {
return this.actual.isGood;
},
});
});
});
然而, '../../test/matchers'
部分窘况丑陋。 测试规范不应该知道文件路径与其他模块的困扰 - 这是RequireJS的工作。 相反,我们要使用符号名称。
解决方案
该RequireJS 路径配置也可以映射目录。
被用于模块名称不应包含扩展,由于路径映射可能是一个目录的路径。
因此,该解决方案是一个简单的路径配置:
test/test-main.js
-----------------
require.config({
baseUrl: '/base/src/js',
paths: {
test: '../../test',
},
// ...
});
现在我可以参考test
目录就好像它是一个孩子baseUrl
:
test/spec/data.js
-----------------
define(['data', 'test/matchers'], function(dataModule) {
// ...
});
这在我的情况下,有效地出来几乎是一样的,如果我能有多重baseUrl
秒。
看看我们是如何处理路由,然后在上下文BoilerplateJS这对于大规模的产品开发参考架构。 我们使用的库crossroads.js路由模块和UI组件。 所有有做的路径是/哈希添加到路由集合,它会通过框架进行路由。
作为一个示例 UI组件的所有路径被添加到URL控制器对象。
作为访问整个应用程序框架的配置信息,配置/设置可以连接到其可以在应用程序内访问的全局上下文对象。