2012-08-01 60 views
36

有什麼辦法可以訪問所有加載的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()比擁有自定義函數名的第三方庫更可能(儘管後者可能更難以調試)。

還是沒有人有更好的想法如何實現這一目標?

回答

59

是,require.s.contexts._.defined是一個對象,它的鍵是模塊的名稱和值包括從模塊返回的值。

require.s.contexts._.defined包括所有的模塊(或者define()require()諸如JavaScript文件是程序的出發點和使用data-main爲RequireJS被指示)。

+4

註冊表和上下文定義有什麼區別? 我在define('Mod',...)後面的上下文._。註冊表對象上看到一個新對象,但是沒有在上下文._。defined中定義。 在require(['Mod'],...)調用後,我看到上下文._。中定義的模塊。 – alexK85 2014-05-29 04:37:22

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(); 
    }); 
}); 
1

我很懶,所以我就這樣做:基於這裏其他的答案

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

相關問題