dynamic要求在RequireJS,得到“模块名称尚未加载上下文”错误?

有没有一种方法来定义一个“dynamic”加载RequireJS中的其他模块? 如果是的话,优化器(r.js)如何理解如何/何时需要包含模块?

例如,让dynModules定义名称/path对的模块:

 define([], function () { return ['moduleA', 'moduleB']; // Array of module names }); 

另一个模块将根据数组dynamic地加载模块。 这不会起作用

 define(['dyn_modules'], function (dynModules) { for(name in dynModules) { var module = require(path); // Call RequireJS require } // ... }); 

… 给我:

未捕获错误:模块名称“moduleA”尚未加载上下文:_。 使用require([]) http://requirejs.org/docs/errors.html#notloaded

我可以解决这个错误 ,但它不再是“dynamic的”:

 define(['dyn_modules', 'moduleA', 'moduleB'], function (dynModules) { for(name in dynModules) { var module = require(path); // Call RequireJS require } // ... }); 

该限制涉及简化的CommonJS语法与正常的callback语法:

加载模块本质上是一个asynchronous的过程,由于未知的下载时间。 但是,仿效服务器端CommonJS规范的RequireJS试图给你一个简化的语法。 当你做这样的事情:

 var foomodule = require('foo'); // do something with fooModule 

在幕后发生的事情是,RequireJS正在查看函数代码的主体,parsing出你需要'foo'并在你的函数执行之前加载它。 但是,当一个variables或任何比简单的string,比如你的例子…

 var module = require(path); // Call RequireJS require 

…然后需求无法parsing出来,并自动转换它。 解决scheme是转换为callback语法;

 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... } }); }); 

编辑:从你自己的答案,我看你使用下划线/ lodash,所以使用_.values_.object可以简化通过参数数组循环如上。

回答我自己。 从RequireJS网站:

 //THIS WILL FAIL define(['require'], function (require) { var namedModule = require('name'); }); 

这个失败了,因为在调用上面的factory函数之前requirejs需要确保加载并执行所有的依赖关系。 所以,要么不传入依赖数组,要么使用依赖数组,列出其中的所有依赖关系。

我的解决scheme

 // 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... }); });