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

Mic*_*ael 43 javascript requirejs js-amd

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

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

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

Ale*_*ack 68

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

require.s.contexts._.defined包括所有的模块(或者define()require()诸如JavaScript文件是程序的起始点,并使用被指示data-main为RequireJS).

  • 注册表和上下文中定义的区别是什么?我在上下文中看到了一个新对象._.注册表对象('Mod',...)之后,但没有在上下文._.定义.在require(['Mod'],...)调用之后,我在上下文中看到模块._.已定义. (5认同)

Vol*_*ose 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();
    });
});
Run Code Online (Sandbox Code Playgroud)