2012-08-01 12 views
36

require.jsのロードされたモジュールにアクセスする方法はありますか?require.js:ロードされたすべてのモジュールにアクセス

背景:私は、自動的にそれらのすべての後に私のjavascript-モジュールのinit()関数を呼び出したい
がロードされて、私は私自身のモジュール・ストレージ上でループし、各init()関数を呼び出しrequire.jsせずにrequire.js + backbone.js: How to structure modules that have an initialize function? を参照してください。
これをrequire.jsで実行します。ロードされたすべてのモジュール(外部ライブラリを含む)のmy_custom_init_function_favoritecolor_petname_love123を呼び出すことは危険です。私はこれがすべてのモジュールの一覧(およびこれらのモジュールの要件)を手動で最新の状態に保つことよりも問題を少なくすることを願っています。あるモジュールinit()を忘れることは、私のカスタム関数名を持つサードパーティのライブラリよりもはるかに可能です(後者はおそらくデバッグが難しいでしょう)。

それを達成する方法についてもっと知っている人はいますか?

答えて

59

はい、require.s.contexts._.definedは、そのキーはモジュール名で、値がそのモジュールから返された値が含まれるオブジェクトです。

require.s.contexts._.definedは、すべてのモジュール(例えば、番組の開始点であるとRequireJSためdata-mainを用いて示されているJavascriptのファイルとしてdefine()又はrequire()のいずれか)を含みます。

+4

レジストリとコンテキストの定義はどのような違いがありますか? 定義の後にレジストリオブジェクト( 'Mod'、...)はありますが、コンテキスト._では定義されていません。 require(['Mod']、...)呼び出しの後、私はコンテキスト上のモジュールを参照しています。 – alexK85

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); 

ここで他の回答に基づいています。

関連する問題