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
属性,这可能会造成干扰,不是吗?此外,那些不是我写的模块呢?