我遇到以下代码:
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
属性。根据{{1}}的值,我想初始化相应的模块,并将结果添加到name
对象中。为了做到这一点,我应该能够知道模块引用的名称。这就是我的问题 - 我想。
这对我很有用,因为这样我就不需要初始化所有模块并将它们推入地图,如果我不打算使用它们 - 那种懒惰的加载程序。
任何帮助或建议?感谢。
答案 0 :(得分:1)
您可以扫描arguments
来构建地图。这是一个设计为在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}));
});