require.js:访问所有加载的模块
有什么办法可以访问所有加载的require.js模块吗?require.js:访问所有加载的模块
背景:
我想自动调用我的javascript模块的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()比拥有自定义函数名的第三方库更可能(尽管后者可能更难以调试)。
还是没有人有更好的想法如何实现这一目标?
是,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);
。
注册表和上下文定义有什么区别? 我在define('Mod',...)后面的上下文._。注册表对象上看到一个新对象,但是没有在上下文._。defined中定义。 在require(['Mod'],...)调用后,我看到上下文._。中定义的模块。 – alexK85 2014-05-29 04:37:22