有没有办法定义一个模块,在 RequireJS 中“动态”加载其他模块?如果是,优化器(r.js)如何理解如何/何时必须包含模块?
例如,让<code>dynModules</code>定义名称/路径对的模块:
define([], function () {
return ['moduleA', 'moduleB']; // Array of module names
});
另一个模块将根据数组动态加载模块。这将不起作用:
define(['dyn_modules'], function (dynModules) {
for(name in dynModules) {
var module = require(path); // Call RequireJS require
}
// ...
});
...给了我:
未捕获的错误:尚未为上下文加载模块名“moduleA”:_。使用必需的([])http://requirejs.org/docs/errors.html#notloaded
我可以解决这个错误,但是它不再是“动态的”了:
define(['dyn_modules', 'moduleA', 'moduleB'], function (dynModules) {
for(name in dynModules) {
var module = require(path); // Call RequireJS require
}
// ...
});
回答我自己。来自需求JS网站:
//THIS WILL FAIL
define(['require'], function (require) {
var namedModule = require('name');
});
这将失败,因为requirejs需要确保在调用上面的工厂函数之前加载并执行所有依赖项。[...]所以,要么不要传入依赖关系数组,要么如果使用依赖关系数组,列出其中所有的依赖关系。
我的解决方案:
// Modules configuration (modules that will be used as Jade helpers)
define(function () {
return {
'moment': 'path/to/moment',
'filesize': 'path/to/filesize',
'_': 'path/to/lodash',
'_s': 'path/to/underscore.string'
};
});
加载程序:
define(['jade', 'lodash', 'config'], function (Jade, _, Config) {
var deps;
// Dynamic require
require(_.values(Config), function () {
deps = _.object(_.keys(Config), arguments);
// Use deps...
});
});
该限制与简化的CommonJS语法和普通回调语法有关:
由于下载模块的时间未知,加载模块本质上是一个异步过程。但是,在模拟服务器端通用JS规范时,要求JS试图为您提供简化的语法。当你做这样的事情时:
var foomodule = require('foo');
// do something with fooModule
幕后发生的事情是,RequireJS正在查看您的函数代码体,解析出您需要“foo ”,并在您的函数执行之前加载它。然而,当变量或除了简单字符串之外的任何东西,比如你的例子...
var module = require(path); // Call RequireJS require
...那么Require就不能解析它并自动转换它。解决方法是转换为回调语法;
var moduleName = 'foo';
require([moduleName], function(fooModule){
// do something with fooModule
})
鉴于上述情况,下面是第二个示例的一个可能改写,以使用标准语法:
define(['dyn_modules'], function (dynModules) {
require(dynModules, function(){
// use arguments since you don't know how many modules you're getting in the callback
for (var i = 0; i < arguments.length; i++){
var mymodule = arguments[i];
// do something with mymodule...
}
});
});
编辑:从您自己的回答中,我看到您使用了下划线/下划线,所以使用了_。值
和_。object
可以简化通过参数数组的循环,如上所述。
问题内容: 有没有一种方法可以定义一个在RequireJS中“动态”加载其他模块的模块?如果是,优化器(r.js)如何理解如何/何时必须包含一个模块? 例如,让一个定义名称/路径对的模块: 另一个模块将基于该阵列动态加载模块。这将 不起作用 : … 给我: 未捕获的错误:尚未为上下文_加载模块名称“ moduleA”。使用require([]) http://requirejs.org/docs/
问题内容: 我正在尝试建立反应的单元测试框架。这样做时,发生以下错误。我搜索了整个互联网,但没有有效的解决方案。下面是显示的错误和我正在使用的代码/软件包。 调试错误 节点包 karma.conf.js 测试/ test.js 非常感谢您的帮助! 问题答案: 当您以CommonJS形式()而不是AMD形式()进行调用时,您所描述的错误正是RequireJS给您的, 并且 调用没有被封装进来。Req
我对RequireJS非常陌生,在编写QUnit到源代码时遇到了困难,源代码具有使用RequireJS动态加载模块的逻辑。 下面是源代码:factory/Factory.js * 运行 QUnit 时,模块“page/something”永远不会加载,并且永远不会调用回调。我在这里错过了什么吗?感谢您的回复。 **QUnit工厂/FactoryTests.js* *test-require-con
问题内容: 可以正常工作,但是想要像这样测试开发分支: 不知道这是怎么回事?如果我做得到相同的结果 问题答案: 所需的软件包具有依赖关系。在1.3.3版中,他们开始使用不带版本后缀的go模块,现在明确指示该版本不再起作用。 如果要在不更新其依赖项的情况下使用devel包,请使用不带标志。 存储库中有关于此问题的公开拉取请求:https : //github.com/gdamore/tcell/pu
问题内容: 我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的继承限制所困。请考虑以下代码: 显然,这不是我所期望的行为(尽管实际行为也很有意义)。因此,我的问题是,你们是否知道在父类中获得子类名称的意思。 问题答案: 简而言之。这不可能。在php4中,您可以实施可怕的破解(检查),但是该方法在PHP5中不起作用。参考资料: 37684 34421 编辑 :PHP 5.3中后
问题内容: 感谢Dan Wahlin的精彩文章,我设法实现了Angular的控制器和服务的延迟加载。但是,似乎没有一种干净的方法来懒惰加载独立的模块。 为了更好地解释我的问题,假设我有一个没有RequireJS的应用,其结构如下: 这是在Plunker中带有RequireJS的示例应用程序:http ://plnkr.co/aiarzVpMJchYPjFRrkwn 问题的核心是Angular不允许