要求:访问/列出所有已加载的模块

时间:2015-10-29 11:11:15

标签: 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,
    // ...
    // 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对象中。为了做到这一点,我应该能够知道模块引用的名称。这就是我的问题 - 我想。

这对我很有用,因为这样我就不需要初始化所有模块并将它们推入地图,如果我不打算使用它们 - 那种懒惰的加载程序。

任何帮助或建议?感谢。

1 个答案:

答案 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}));
});