有没有办法访问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()比具有我的自定义函数名的第三方库更有可能(尽管后者可能更难调试)。
或者有人更了解如何实现这一目标吗?
答案 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);
基于此处的其他答案。