要求: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}));
});