あなたが探している効果を提供するのは、AMDのセマンティクスの一部ではありません。唯一の保証は、require
に渡すコールバックが、依存関係配列にリストされているモジュールとその依存関係がロードされるまで実行されないことです。
RequireJSは、ブラウザがサーバーにリクエストを送信する方法を細かく制御できません。たとえば、リクエストを発行するまでにブラウザに既に他のリクエストが多すぎる場合(スタイルシート、イメージ、またはリクエストしたモジュール以外にロードする必要があるものについてはrequire
)、ブラウザ以前のものが解決されるまでRequireJSの要求を遅らせることを決定するかもしれません。
サーバー側で要求がどのように解決されるかは、どのような順序で発生するかにも影響します。
あなたのアプリケーションの構造があります。 main.config().modules
に['A', 'B', 'C']
が含まれているとします。したがって、A
、B
、C
を順番にロードし、できるだけ早く初期化する必要があります。しかし、これらのすべてのモジュールもjquery
に依存していることがわかります。 RequireJSがA
を実行すると、define(['jquery], function ($) {...
が実行されます。さて、今はjquery
を取得する必要があります。 jquery
がフェッチされるまでには、B
とC
もそれを待つことになります。したがって、RequireJSはA
,B
、C
を実行し、コールバックは近い順に待機します。 1つの依存関係だけでは大したことではないかもしれませんが、あなたのモジュールが他の共通モジュールに依存している場合は、それが加算され、最終的な結果は共通モジュールがロードされている間に顕著な待機を得て、それからA
、B
、C
はバッチで実行されます。
RequireJS独自のオプティマイザまたはAMDモジュールを理解している別のオプティマイザを使用して、モジュールを組み合わせて、探している結果を優先するバンドルにすることができます。このような最適化を行うには、開発者がアプリケーションの構造を慎重に分析する必要があります。一般的なケースでは、後で結果を得るためにオンにできる単一のフラグ、オプション、またはプラグインはありません。さらに、上記のように、ブラウザとサーバーはすべてそれをぶち壊すような方法で動作する可能性があります。
完全性について言及しておくべきことの1つです。あなたは、順次、初期化が、以前のものがロードされた後にのみつのモジュールに要求を強制することができます。
;(function(doc, win, undefined) {
'use strict';
define(['module', 'domReady!'], function(main) {
var modules = main.config().modules;
function next() {
var name = modules.shift();
if (name === undefined) {
return;
}
require([name], function (module) {
// When one module has loaded, we initiate the request for the
// next one.
next();
// And init what we've got now.
module.init();
});
}
next();
});
}(document, window));
しかし、ここでのコストはB
等、A
がロードされた後にのみ要求されていることです元のコードでは、すべてのモジュールがバットからすぐに要求されます。これにより、総初期化時間が長くなる可能性があります。
非常に深遠な答えをありがとう!私のアプリケーションでRequireJSライブラリを利用する前に、ロード速度は実際には比較的速く、少なくとも比較的速いダウンロード速度であった。私がRequireJSを使い始めた最大の理由は、私のアプリが将来的に(特に、依存関係やモジュールの数が増えると)成長していくかどうかを確認することでした。主な目標は、メインの依存関係を取得してモジュールを初期化することの遅れを小さくすることです。少なくとも私の "ロード"モジュールをロードして素早く初期化して、ユーザーエクスペリエンスを向上させる。 –