RequireJS の要件
- ブラウザの自然な動作に従う§ 1
- ページ読み込み前後のコードをロードする§ 2
- スクリプトが依存関係を指定できるようにする§ 3
- ローダーがネストされた依存関係をロードできるようにする§ 4
- モジュールは依存関係に従って評価される必要がある§ 5
- モジュール形式はコンパクトである必要がある§ 6
- コアローダーを合理化し、将来への拡張性を持たせる§ 7
- モジュールがグローバル名前空間をクリーンに保てるようにする§ 8
- 任意のスクリプトをロードする§ 9
- パフォーマンスアップグレードを可能にする§ 10
ブラウザの自然な動作に従う§ 1
XMLHttpRequest(XHR) ローダーはページと同じドメインに制限され、デバッグが困難になります。特定のブラウザではクロスドメイン XHR 呼び出しと、eval が使用された場合のデバッグのためのより良い規約が許可されていますが、ブラウザ間のサポートは一貫していません。
eval ベースのローダーは、eval が JavaScript のベストプラクティスではなく、一部の環境では許可されていないため、避ける必要があります。eval を使用する適切なタイミングと場所はありますが、モジュールローダーはそれを使用するよりも優れた方法があります。
スクリプトをその場で変換するサーバープロセスも必要ありません。全員が同じサーバープロセスを使用するようにしたり、共通形式の仕様を作成して、すべてのサーバープロセスが同じ形式で出力できるようにすることは、より多くのオーバーヘッドと、記述する必要があるものが発生します。フロントエンド開発者は、大量のサーバーハードウェアなしで、プレーンテキストファイルを作成してブラウザにロードできるという長年の慣習を持っています。
スクリプトタグ経由でロードされたスクリプトはどこでも動作し、ドメインを越えて動作します。これは、ブラウザがスクリプトをロードする自然な方法を使用する、はるかに単純なロードスタイルです。
ページ読み込み前後のコードをロードする§ 2
同じシステムがページ読み込み前後に使用できる必要があります。後でページアクションまでコードのロードを遅らせることは、パフォーマンス上の大きなメリットです。
スクリプトが依存関係を指定できるようにする§ 3
プロジェクトがいくつかのスクリプトを必要とする範囲を超えて拡大することは非常に簡単です。すべての依存関係と正しいロード順序を手動で追跡することは困難です。スクリプトは、その直接の依存関係を指定できる必要があります。開発者は、それらの依存関係がロードする必要があるものを心配したり、正しいロード順序を調べたりする必要はありません。
ローダーがネストされた依存関係をロードできるようにする§ 4
各モジュールが独自の直接の依存関係を指定する場合、ローダーは、ネストされた依存関係、つまり依存関係の依存関係であっても、システム全体の正しい依存関係を判別できる必要があります。
スクリプトは順序不同で評価できますが、モジュールは依存関係に従って評価される必要があります§ 5
ページ読み込み後にネストされた依存関係解決を持つブラウザネイティブのスクリプトロードを使用することは、スクリプトが少なくとも一部の時間で script 要素に appendChild を使用してロードされる必要があることを意味します。
IE と WebKit は、appendChild を介して追加されたスクリプトを DOM 順序ではなく、ネットワーク受信順序で実行します。DOM に追加された順序でスクリプトを実行したとしても、モジュールの依存関係はモジュールスクリプトがロードされた後に検出されるため、依存関係のスクリプトは常にそれらを必要とするスクリプトの後に追加されます。
これは、スクリプトのモジュール形式を構築することにつながります。そのスクリプトの大部分を関数に入れ、その関数の外部に依存関係を指定します。これにより、ブラウザによってスクリプトを順序不同で評価できますが、依存関係を適切に判別してから、関数ラッパーを正しい順序で呼び出してスクリプトを生成する機会が得られます。
モジュール形式はコンパクトである必要がある§ 6
ボイラープレートコードは面倒です。ただし、関数ラッパーはボイラープレートの一部として必要です。開発者が手動でコーディングしやすいように、ボイラープレートをできるだけ簡潔にすることをお勧めします。開発者が手動でコーディングする必要があるため、プロパティごとに名前/値ペアを使用する過度に明示的なモジュール形式は避けてください。
コアローダーを合理化し、将来への拡張性を持たせる§ 7
ネストされた依存関係解決を備えたローダー、モジュール形式サポートのコアはコンパクトである必要がありますが、プラグインが依存関係の概念とそれらをロードするという意味を拡張できるようにする必要があります。
Dojo では、i18n 文字列バンドルとウィジェット構造用の HTML テキスト文字列が必要になることが一般的です。ローダーがこれらのものをロードできるようにしますが、プラグインとしてロードして、コアが軽量な状態を保つようにします。
モジュールがグローバル名前空間をクリーンに保てるようにする§ 8
プロジェクトが大きくなるにつれて、ページにモジュールの 2 つのバージョンをロードする必要性が高まります。これは、グローバル名前空間でモジュールを定義しないモジュールシステムを許可することで可能にする必要があります。
モジュールがグローバル名前空間で動作したい場合、通常、モジュール仕様で簡単に許可できます。より難しい部分は、グローバル名前空間を回避するためにうまく機能する形式を構築することです。
任意のスクリプトをロードする§ 9
すべてのスクリプトがモジュール形式を使用するわけではありません。既存のスクリプトをロードして、依存関係として扱うことを許可します。
パフォーマンスアップグレードを可能にする§ 10
これは主に、モジュールを結合および最適化できるビルドシステムを持つことを意味します。また、ローダーは、複数のモジュールが定義されているスクリプトをロードし、そのスクリプトファイルにまだ含まれていない依存関係のみをフェッチできるようにする必要があります。