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.js
和http://prettyprint.jpillora.com/js/view/bar.js
如此处所示,应用程序只是一个main.js
其他所有来自framework
:
最后,每当我通过上面的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.js
和data.js
)假设一个RequireJSconfiguration,将data
parsing为src/js/data.js
, lib/underscore
到src/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/设置附加到可在应用程序内部访问的全局上下文对象。