これはより具体的な例です。
60ファイルのプロジェクトで作業しています。それを実行する2つの異なるモードがあります。
連結されたバージョンの1つの大きなファイルをロードします。(製造)
60ファイルすべてをロード(開発)
ローダーを使用しているため、Webページにスクリプトが1つだけあります
<script src="loader.js"></script>
デフォルトはモード1です(1つの大きな連結ファイルをロードします)。モード2(個別のファイル)でinを実行するには、いくつかのフラグを設定します。それは何でもかまいません。クエリ文字列のキー。この例では、これを行います
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.jsは次のようになります
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
ビルドスクリプトは、次のような.shファイルです。
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
等...
新しいファイルが追加された場合、開発を行っているため、おそらくmode#2を使用しますinjectScript("somenewfile.js")
。loader.jsに行を追加する必要があります
次に、後で生産するために、ビルドスクリプトにsomenewfile.jsを追加する必要があります。忘れがちなエラーメッセージが表示される手順。
AMDに切り替えることで、2つのファイルを編集する必要がなくなります。loader.jsとビルドスクリプトを同期させる問題はなくなりました。r.js
またはwebpack
それを使用して、ビルドするコードを読み取ることができますlarge-concantinated.js
また、依存関係も処理できます。たとえば、次のように2つのファイルlib1.jsとlib2.jsをロードしました。
injectScript("lib1.js");
injectScript("lib2.js");
lib2にはlib1が必要です。それは何かのようなコードを内部に持っています
lib1Api.installPlugin(...);
ただし、挿入されたスクリプトは非同期で読み込まれるため、正しい順序で読み込まれる保証はありません。これらの2つのスクリプトはAMDスクリプトではありませんが、require.jsを使用すると、依存関係を伝えることができます
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
私はこれを行うlib1を使用するモジュール
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
これでrequire.jsがスクリプトを挿入し、lib2がlib1に依存することを伝えたため、lib1がロードされるまでlib2を挿入しません。また、lib2とlib1の両方がロードされるまで、lib1を使用するモジュールは開始されません。
これにより、開発がスムーズになり(ビルド手順がなく、読み込み順序を心配する必要もありません)、プロダクションが快適になります(追加されたスクリプトごとにビルドスクリプトを更新する必要がありません)。
追加のボーナスとして、webpackのbabelプラグインを使用して、古いブラウザーのコードでbabelを実行できます。この場合も、そのビルドスクリプトを維持する必要はありません。
Chrome(選択したブラウザー)がimport
実際にサポートを開始した場合は、おそらく開発用に切り替えますが、実際には何も変更されません。それでも、webpackを使用して連結ファイルを作成でき、すべてのブラウザーのコードに対してbabelを実行できます。
これはすべて、スクリプトタグを使用せず、AMDを使用することで得られます。