require.js:访问所有加载的模块
有没有办法访问require.js的所有加载模块?
背景:
我想自动调用我的JavaScript模块的init()
函数加载后,请参阅require.js + backbone.js:如何构造具有初始化函数的模块? 没有require.js我打开了我自己的模块存储并调用每个init()
函数。
我现在想用require.js来做到这一点。 我知道调用每个加载模块(包括外部库)的my_custom_init_function_favoritecolor_petname_love123
是危险的。 我希望这会比手动保存所有模块的清单(以及这些模块的要求)更新更为麻烦。 忘记一个模块init()比拥有自定义函数名称的第三方库更可能(尽pipe后者可能更难以debugging)。
还是有人有一个更好的想法,如何做到这一点?
是的, require.s.contexts._.defined
是一个对象,其键是模块名称,值包括从该模块返回的值。
require.s.contexts._.defined
包含了所有的模块( define()
或者require()
例如程序起点的Javascript文件,用requireJS的data-main
表示)。
刚刚在我的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(); }); });
我很懒,所以我只是这样做了:
var modulesToLoad = Object.keys(require.s.contexts['_'].registry); require(modulesToLoad);
基于这里的其他答案。