有没有什么办法来访问require.js的所有加载的模块?
背景:
我想自动调用一个init()
所有的人都被加载后的我的JavaScript模块的功能,请参阅require.js + Backbone.js的:如何构建有一个初始化函数模块? 如果没有require.js我挂绕在我自己的模块存储,并呼吁各init()
函数。
我现在想require.js做到这一点。 我知道,调用my_custom_init_function_favoritecolor_petname_love123
每一个加载的模块(包括外部库)是危险的。 我希望这会造成比人工饲养的所有模块(这些模块的需求)的名单上最新的少一些麻烦。 忘记一个模块的init()比有我的自定义函数名(尽管后者可能是难以调试)第三方库更容易。
或者有没有人有关于如何完成一个更好的主意?
是的, require.s.contexts._.defined
为一个对象,其它的键是模块名和值包括从该模块返回的值。
require.s.contexts._.defined
包括的所有模块(或者define()
或require()
如JavaScript文件是程序的起始点,并使用被指示data-main
为RequireJS)。
刚刚完成我的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);
基于这里其他的答案。