2

requirejs では、名前を文字どおりに設定せずにモジュールを定義できます。次に例を示します。

//in a.js
define([/*deplist*/],function(){
    /*do something*/
});

//in b.js
define([/*deplist*/],function(){
    /*do something*/
});

また、requirejs はファイル名 ("a" と "b") に従ってモジュール名を設定します。Requirejs は<script>、アプリケーションが必要とするすべてのタグを追加します。それらは順番にロードされません (ネットワーク タイムラインが言ったように)。

js ファイルのロード タイムライン

モジュールが自分自身を定義するために呼び出されたときdefine、それはそのモジュール名を認識していないため、自分自身をdefQueue初期化の待機状態に置きます。初期化はロード イベント ハンドラで行われます。これは、イベント ハンドラ関数でノード参照にアクセスでき、モジュール名がノード属性に記録されるためです (このように: <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="./a.js"></script>)。

ここに問題があります。モジュール呼び出しの順序が、defineモジュールのノードloadイベント トリガーと同じであることを保証できません。では、モジュール名をモジュール ファクトリに正しくマッピングするにはどうすればよいでしょうか。

4

1 に答える 1

1

jsの評価が判明し、その参照ノードの「ロード」イベントのトリガー順序は偶然です。

モジュールのjsファイルがロードされた後、その中のコンテンツが評価され(いつかはわかりませんが、ロードされたjsファイルの順序で評価されます)、requirejsはファクトリリストと依存関係リストをFIFOキューにプッシュします。ブラウザは、ロードされたjsファイルと同じ順序でノードロードイベントをトリガーし、requirejsはモジュールIDとそのファクトリを「ロード」イベントハンドラにリンクします。

たとえば、a.jsがb.jsの前にロードされる場合、a.jsのコンテンツはb.jsまでに評価され、a.jsの「load」イベントハンドラーはb.jsまでに呼び出されます。次に、マップされたモジュールのIDがファクトリリストと依存関係リストになることを確認できます。

于 2013-03-11T02:18:32.250 に答える