web-dev-qa-db-ja.com

require.js:ロードされたすべてのモジュールにアクセスします

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

バックグラウンド:
javascript-modulesのinit()関数をすべてロードした後、それらを自動的に呼び出したい require.js + backbone.js:初期化関数? require.jsなしで、私は自分のモジュールストレージをループして、各init()関数を呼び出しました。
これをrequire.jsで実行したいと思います。読み込まれたすべてのモジュール(外部ライブラリを含む)のmy_custom_init_function_favoritecolor_petname_love123を呼び出すのは危険であることを知っています。これにより、すべてのモジュール(およびこれらのモジュールの要件)のリストを手動で最新の状態に保つよりも問題が少なくなることを願っています。 1つのモジュールinit()を忘れることは、カスタム関数名を持つサードパーティのライブラリよりもはるかに可能性が高いです(後者はおそらくデバッグが難しいでしょう)。

それとも、それを達成する方法についてより良いアイデアを持っている人はいますか?

44
Michael

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

_require.s.contexts._.defined_にはすべてのモジュールが含まれます(define()またはrequire()など、プログラムの開始点であり、RequireJSに対して_data-main_を使用して示されるJavascriptファイルなど)。

70
AlexStack

私の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();
    });
});
11
Volker Rose

私は怠惰なので、これをやっただけです:

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

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

1
Zar Shardan