【问题标题】:require.js: Access all loaded modulesrequire.js:访问所有加载的模块
【发布时间】:2012-07-30 04:27:51
【问题描述】:

有没有办法访问 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() 的可能性要大得多(尽管后者可能更难调试)。

或者有没有人对如何实现这一点有更好的想法?

【问题讨论】:

    标签: javascript requirejs js-amd


    【解决方案1】:

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

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

    【讨论】:

    • 注册表和上下文定义有什么区别?在定义('Mod',...)之后,我在 context._.registry 对象上看到了一个新对象,但在 context._.defined 上却没有。在 require(['Mod'],...) 调用后,我在 context._.defined 上看到了模块。
    • 无法读取未定义的属性“上下文”。 Require 是方法,所以切换到这个对我有用 requirejs.s.contexts._.defined
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      根据此处的其他答案。

      【讨论】:

        猜你喜欢
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多