44

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

背景:
我想init()在所有加载后自动调用我的 javascript-modules 的函数,请参阅require.js + backbone.js:如何构造具有初始化函数的模块? 在没有 require.js 的情况下,我遍历了我自己的模块存储并调用了每个init()函数。
我现在想用 require.js 来做这件事。我知道调用my_custom_init_function_favoritecolor_petname_love123每个加载的模块(包括外部库)是危险的。我希望这会比手动更新所有模块(以及这些模块的要求)列表造成的麻烦更少。忘记一个模块 init() 比具有我的自定义函数名称的第三方库更有可能(尽管后者可能更难调试)。

或者有没有人对如何实现这一点有更好的想法?

4

3 回答 3

71

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

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

于 2013-09-27T05:52:53.400 回答
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();
    });
});
于 2012-12-18T13:06:37.817 回答
1

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

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

基于此处的其他答案。

于 2017-03-24T20:57:20.807 回答