require.js:访问所有已加载的模块

时间:2012-08-01 09:36:02

标签: javascript requirejs js-amd

有没有办法访问require.js的所有已加载模块?

背景:
我想在加载所有javascript-modules之后自动调用init()函数,请参阅require.js + backbone.js: How to structure modules that have an initialize function? 如果没有require.js,我会遍历我自己的模块存储并调用每个init()函数 我现在想用require.js做这件事。我知道调用每个加载模块的my_custom_init_function_favoritecolor_petname_love123(包括外部库)是危险的。我希望这比手动保持所有模块的列表(以及这些模块的要求)是最新的更少麻烦。忘记一个模块init()比具有我的自定义函数名的第三方库更有可能(尽管后者可能更难调试)。

或者有人更了解如何实现这一目标吗?

3 个答案:

答案 0 :(得分:68)

是的,require.s.contexts._.defined是一个对象,其键是模块名称,值包括从该模块返回的值。

require.s.contexts._.defined包含所有模块(define()require(),例如作为程序起点的Javascript文件,并使用data-main表示RequireJS)

答案 1 :(得分:11)

刚刚在我的RequireJS项目中完成了类似的行为。 require.s.contexts['_'].registry包含已注册模块的列表。

我使用Underscore.js来获取,过滤和迭代模块列表。也许以下代码片段可以帮助您:

var modules_registered = _.keys(require.s.contexts['_'].registry);
var modules_to_be_initialized = _.filter(modules_registered, function(module_title) {
    return module_title.indexOf('modules') > -1;
});

_.each(modules_to_be_initialized, function(module_name) {
    require([module_name], function(current_module) {
        current_module.init();
    });
});

答案 2 :(得分:1)

我很懒,所以我就这样做了:

    var modulesToLoad = Object.keys(require.s.contexts['_'].registry);
    require(modulesToLoad);

基于此处的其他答案。