要求:访问/列出所有加载的模块

我在我有以下代码的情况:

define([ "require", "./module1/module1", "./module2/module2", "./module3/module3", // ... // hundreds of modules here (with their path) // ... ], function ( require, module1, module2, module3, // ... // hundreds of modules's name here // ... ) { var myMod = function() { myMap = { | "module1": new module1(), | This is the part "module2": new module2(), | I would like to "module3": new module3() | optimize. } | return myMod; }); 

在这里为每个加载的模块,我初始化并推入地图。 当然,上面的代码是不可读的,可维护的和可怕的。

相反,我想要做下面的事情:

 define([ "require", // ... // hundreds of modules here (with their path) // ... ], function ( require, // ... // hundreds of modules's name here // ... ) { var myMod = function(myDict) { myMap = {} for (var elem in myDict) { ***myMap[elem.name] = new $corresponding-elem-referece$();*** // pseudo-code. } return myMod; }); 

基本上, myDict字典中的每个元素都有一个name属性。 根据name的值我想初始化相应的模块并将结果添加到myMap对象中。 为了做到这一点,我应该能够知道它的名字的模块引用。 这里生活我的问题 – 我想。

这对我很有用,因为这样我就不需要初始化所有的模块并将它们推入地图,如果我不会使用它们 – 这种懒惰的加载器。

任何帮助或build议? 谢谢。

你可以扫描arguments来build立你的地图。 这是一个devise为在Node.js中按原样运行的示例。 代码中的注释说明了发生了什么事情。

 var requirejs = require("requirejs"); var req = requirejs({}); function generic_module(module) { function m() { // Convenience so that we can distinguish instances... this.from_module = module.id; }; // Set an `id` property on the function we return so that we can // match by module id rather than function name. Module.id is the // name by which the module is known to RequireJS. m.id = module.id; return m; } requirejs.define('a', ['module'], generic_module); requirejs.define('b', ['module'], generic_module); requirejs.define('c', ['module'], generic_module); requirejs.define('test', ['require', 'a', 'b', 'c'], function () { // Create a map from module name to module value. We use the `id` // field we set on the module's return values to be able to map by // module id instead of function name. var name_to_value = Object.create(null); for (var i = 1; i < arguments.length; ++i) { var arg = arguments[i]; name_to_value[arg.id] = arg; } // The myDict value should be a dictionary whose keys are module // ids. function myMod(myDict) { var keys = Object.keys(myDict); var myMap = Object.create(null); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; var value = name_to_value[key]; myMap[key] = new value(); } return myMap; } return myMod; }); req(['test'], function (test) { console.log(test({'a': 1, 'b': 1})); });