RequireJS:有没有办法实现多个基本的URL?

我想使用一个单独的域作为JavaScript框架,它会创build一个基本的需求configuration,我可以从应用程序中增加。

foo.example.com main.js lib/foo-specific.js framework.example.com framework.js <-- entry point lib/jquery.js lib/etc... 

最好,我希望能够要求“lib / foo-specific”和/或“lib / jquery”,并且path只是很好的解决,但是从我发现的,没有办法做到这一点,除非我为框架中的每个js文件使用特定的path键/值。 目前,我有一个自定义的插件来加载给定的path与不同的基地址(例如fw!lib/jquery ),但如果我想使用text! 插件,它不会工作,插件链不受支持。

请参阅https://github.com/jpillora/js-framework ,了解我目前的使用情况,以及https://github.com/jpillora/prettyprinter的用例。

有没有一个干净的方法来解决这个问题? 或者实现多个基本的URL?

注:我也研究了多个需求实例,但我不认为这将工作,因为我希望应用程序能够访问框架的configuration。

关于RequireJS Github的James Burke回答问题页面: 问题#447:多个基本URL·jrburke / requirejs 。

事实certificate,如果data-main是脚本的唯一入口(更多信息 ,请参阅注释) ,我解决了以下特定问题:

我的应用的index.html

 <script src="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 ,它使应用程序代码知道框架代码的path。

例如,在应用程序http://prettyprint.jpillora.com/中; ,一旦需要加载framework.js ,它将设置path到lib/... http://framework.jpillora.com/并设置;./js/作为./js/所以一旦main被需要,它将基本url设置为它自己的域和lib指向另一个域。

哪个结果require(['lib/foo', 'view/bar']); 解决:

http://framework.jpillora.com/js/lib/foo.jshttp://prettyprint.jpillora.com/js/view/bar.js

如此处所示,应用程序只是一个main.js其他所有来自framework

铬devtools加载应用程序

最后,每当我通过上面的framework.js加载应用程序的main.js ,我就可以访问我所有常用的库和实用程序类。 查看应用程序源码

另外请注意,通过r.js优化器和一个不错的本地文件结构,还可以将应用程序优化为一个js文件,只需从framework所需内容。

问题

在尝试build立testing环境时,我遇到了类似的问题。 我有这样的文件结构:

 myApp/ src/ js/ app.js data.js lib/underscore.js test/ karma.conf.js test-main.js matchers.js spec/ data.js 

这里是棘手的地方:我的应用程序脚本( app.jsdata.js )假设一个RequireJSconfiguration,将dataparsing为src/js/data.jslib/underscoresrc/js/lib/underscore.js等我也需要在我的testing环境中进行configuration:

 test/test-main.js ----------------- require.config({ // Karma serves files under /base, which is the basePath from your config file baseUrl: '/base/src/js', // ... }); 

现在我可以写我的testing:

 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'部分是非常丑陋的。 testing规格不应该因为知道到其他模块的文件path而被打扰 – 这就是RequireJS的工作。 相反,我们要使用符号名称。

解决scheme

RequireJS pathconfiguration也可以映射目录。

用于模块名称的path不应包含扩展名,因为path映射可能是针对目录的。

所以,解决scheme是一个简单的pathconfiguration:

 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 ,那么它的效果就baseUrl

看看我们如何处理路由和BoilerplateJS中的上下文,这是一个大规模产品开发的参考架构。 我们使用库crossroads.js来路由模块和UI组件。 所有要做的就是将path/散列添加到路由集合中,并将通过框架进行路由。

作为一个例子 ,UI组件的所有path都被添加到URL控制器对象中。

至于在整个应用程序中访问框架configuration信息,可以将configuration/设置附加到可在应用程序内部访问的全局上下文对象。