首页 文章

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

提问于
浏览
42

有没有办法访问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()比具有我的自定义函数名的第三方库更有可能(尽管后者可能更难调试) .

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

3 回答

  • 1

    我很懒,所以我这样做了:

    var modulesToLoad = Object.keys(require.s.contexts['_'].registry);
        require(modulesToLoad);
    

    根据其他答案在这里 .

  • 11

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

    require.s.contexts._.defined 包括所有模块( define()require() ,例如作为程序起点的Javascript文件,并使用 data-main 表示RequireJS) .

  • 68

    刚刚在我的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();
        });
    });
    

相关问题