Javascript 要求:访问/列出所有加载的模块
我的情况是,我有以下代码:Javascript 要求:访问/列出所有加载的模块,javascript,node.js,requirejs,amd,Javascript,Node.js,Requirejs,Amd,我的情况是,我有以下代码: define([ "require", "./module1/module1", "./module2/module2", "./module3/module3", // ... // hundreds of modules here (with their path) // ... ], function ( require, module1, module2, module3,
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
对象中。为了做到这一点,我应该能够让模块引用知道它的名称。我想这就是我的问题所在
这对我来说很有用,因为这样我就不需要初始化所有的模块并将它们推到地图中,如果我不打算使用它们的话——这是一种惰性加载程序
有什么帮助或建议吗?谢谢。您可以扫描
参数来构建地图。下面是一个设计为在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}));
});
var requirejs=require(“requirejs”);
var req=requirejs({});
功能通用模块(模块){
函数m(){
//方便,以便我们能够区分实例。。。
this.from_module=module.id;
};
//在返回的函数上设置'id'属性,以便
//按模块id而不是函数名匹配。module.id是
//RequireJS已知模块的名称。
m、 id=module.id;
返回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(){
//创建一个从模块名到模块值的映射`
//我们在模块返回值上设置的字段,以便能够通过
//模块id而不是函数名。
var name_to_value=Object.create(null);
对于(变量i=1;i
嗯,我发布的代码是我目前拥有的结构,我想说我无法更改它。我现在将编辑以添加更多内容-请参阅要求。我已编辑了我的答案。我看到的变化是,您还需要require
。好的,从1开始迭代,而不是从0开始。还有什么我错过的吗?好吧,我是个白痴!我没有想到参数
这件事。谢谢然而,目前,问题仍然存在——只是有点进一步。事实上,现在根据myDict.name值,我必须找到以这种方式调用的对象。换句话说,对于每个myDict的元素,我必须获得它的name
属性,然后搜索相应的参数[I],最后实例化它。首先感谢您的努力。你的答案可以接受,因为它是有效的。然而,这意味着我必须在我需要的每个模块中添加一个id
属性,这可能会造成干扰,不是吗?此外,那些不是我写的模块呢?