要求:access/list 所有加载的模块
Require: access/list all loaded modules
我的情况是我有以下代码:
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
对象中。为了做到这一点,我应该能够获得知道其名称的模块引用。这就是我的问题 - 我想。
这对我很有用,因为这样我就不需要初始化 所有 模块并将它们推送到地图中,如果我不打算使用它们的话 - 有点惰性加载程序。
有什么帮助或建议吗?谢谢。
您可以扫描 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}));
});
我的情况是我有以下代码:
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
对象中。为了做到这一点,我应该能够获得知道其名称的模块引用。这就是我的问题 - 我想。
这对我很有用,因为这样我就不需要初始化 所有 模块并将它们推送到地图中,如果我不打算使用它们的话 - 有点惰性加载程序。
有什么帮助或建议吗?谢谢。
您可以扫描 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}));
});