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语法:
- http://requirejs.org/docs/whyamd.html#commonjscompat
- https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define
加载模块本质上是一个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... }); });