[解決済み] Webpack の CommonsChunkPlugin について教えてください。
質問
一般的な話として
CommonsChunkPlugin
はすべてのエントリポイントを見て、それらの間に共通のパッケージや依存関係があるかどうかをチェックし、それらを独自のバンドルに分離します。
では、以下のような構成にしたとします。
...
enrty : {
entry1 : 'entry1.js', //which has 'jquery' as a dependency
entry2 : 'entry2.js', //which has 'jquery as a dependency
vendors : [
'jquery',
'some_jquery_plugin' //which has 'jquery' as a dependency
]
},
output: {
path: PATHS.build,
filename: '[name].bundle.js'
}
...
を使わずにバンドルすると
CommonsChunkPlugin
新しいバンドルファイルが3つできてしまいます。
-
entry1.bundle.js
からの完全なコードを含むentry1.js
とjquery
であり、独自のランタイムを含む -
entry2.bundle.js
から完全なコードを含むentry2.js
とjquery
であり、独自のランタイムを含む -
vendors.bundle.js
から完全なコードを含むjquery
とsome_jquery_plugin
であり、独自のランタイムを含む
これは明らかに悪いことで、私は潜在的に
jquery
を3回読み込むことになるので、これは明らかに悪いことです。
を使って束ねると
CommonsChunkPlugin
にどのような引数を渡すかによって
CommonsChunkPlugin
に渡す引数によって、次のようなことが起こります。
-
CASE 1 : もし私が
{ name : 'commons' }
を渡すと、以下のようなバンドルファイルができあがります。-
entry1.bundle.js
からの完全なコードを含むentry1.js
の要件であるjquery
を含んでおらず、ランタイムの -
entry2.bundle.js
から完全なコードを含んでいます。entry2.js
の要件であるjquery
を含んでおらず、ランタイムの -
vendors.bundle.js
から完全なコードを含んでいます。some_jquery_plugin
の要件であるjquery
を含んでおらず、ランタイムの -
commons.bundle.js
から完全なコードを含んでいます。jquery
を含み、ランタイム
この方法では、全体としていくつかの小さなバンドルができあがり、ランタイムは
commons
バンドルに含まれています。かなり良いですが、理想的ではありません。 -
-
CASE 2 : もし私が
{ name : 'vendors' }
を渡すと、以下のようなバンドルファイルができあがります。-
entry1.bundle.js
からの完全なコードを含むentry1.js
の要件であるjquery
を含んでおらず、ランタイムの -
entry2.bundle.js
から完全なコードを含んでいます。entry2.js
の要件であるjquery
を含んでおらず、ランタイムの -
vendors.bundle.js
から完全なコードを含んでいます。jquery
とsome_jquery_plugin
であり、ランタイムを含んでいます。
この方法でも、全体としては小さなバンドルになりますが、ランタイムが
vendors
バンドルに含まれています。前のケースより少し悪いのは、ランタイムがvendors
バンドルになったからです。 -
-
CASE 3 : もし私が
{ names : ['vendors', 'manifest'] }
を渡すと、以下のようなバンドルファイルができあがります。-
entry1.bundle.js
からの完全なコードを含むentry1.js
の要件であるjquery
を含んでおらず、ランタイムの -
entry2.bundle.js
から完全なコードを含んでいます。entry2.js
の要件であるjquery
を含んでおらず、ランタイムの -
vendors.bundle.js
から完全なコードを含んでいます。jquery
とsome_jquery_plugin
で、ランタイムを含まない -
manifest.bundle.js
他のすべてのバンドルに対する要求事項を含み、ランタイムを含む
この方法では、全体としていくつかの小さなバンドルができあがり、ランタイムは
manifest
バンドルに含まれます。これは理想的なケースです。 -
理解できないこと/理解できるか不安なこと
-
で CASE 2 になってしまったのはなぜでしょうか?
vendors
バンドルに共通のコード (jquery
) とvendors
のエントリに残っているもの (some_jquery_plugin
)? 私の理解では、何がCommonsChunkPlugin
がしたことは、共通のコード (jquery
) を集め、それを強制的にvendors
バンドルに出力するよう強制したので、それは一種の "merged" 共通コードをvendors
バンドルにマージしています。some_jquery_plugin
). 確認または説明をお願いします。 -
で CASE 3 を渡すとどうなるのかがわからない。
{ names : ['vendors', 'manifest'] }
をプラグインに渡したとき、何が起こったのか理解できません。なぜ/どのようにvendors
の両方が含まれるバンドルがそのまま維持されているのでしょうか?jquery
とsome_jquery_plugin
の場合jquery
は明らかに共通の依存関係であるのに、なぜ生成されたmanifest.bundle.js
ファイルはなぜそのように作成されたのでしょうか (他のすべてのバンドルを必要とし、ランタイムを含む) ?
どのように解決するのですか?
このように
CommonsChunkPlugin
は動作します。
共通のチャンクはいくつかのエントリーチャンクで共有されるモジュールを "受け取ります" 。 複雑な構成の良い例としては Webpack リポジトリ .
は
CommonsChunkPlugin
は Webpack の最適化フェーズで実行されます。つまり、チャンクがシールされてディスクに書き込まれる直前に、メモリ上で動作します。
複数の共通チャンクが定義されている場合、それらは順番に処理されます。あなたのケース 3 では、プラグインを 2 回実行するようなものです。しかし、注意していただきたいのは
CommonsChunkPlugin
はより複雑な設定 (minSize, minChunks など) が可能で、モジュールの移動方法に影響を与えることに注意してください。
CASE 1:
-
3つあります。
entry
チャンク (entry1
,entry2
とvendors
). -
コンフィギュレーションでは
commons
チャンクを共通のチャンクとして設定します。 -
プラグインは
commons
の共通チャンクを処理します(チャンクが存在しないため、作成されます)。-
他のチャンクで複数回使用されているモジュールを集めます。
entry1
,entry2
とvendors
を使うjquery
であるため、これらのチャンクからモジュールが削除され、モジュールがcommons
チャンクに追加されます。 -
は
commons
チャンクのフラグはentry
チャンクとしてフラグが立ちますがentry1
,entry2
とvendors
というチャンクは、フラグを立てずにentry
.
-
他のチャンクで複数回使用されているモジュールを集めます。
-
最後に
commons
チャンクはentry
チャンクにはランタイムとjquery
モジュールが含まれています。
CASE 2:
-
3つあります。
entry
チャンク (entry1
,entry2
とvendors
). -
コンフィギュレーションでは
vendors
チャンクを共通のチャンクとして設定します。 -
プラグインは
vendors
共通チャンクを処理します。-
他のチャンクで複数回使用されているモジュールを集めます。
entry1
とentry2
を使うjquery
であるため、これらのチャンクからモジュールが削除されます(モジュールがvendors
チャンクに追加されないことに注意してください。vendors
チャンクはすでにそれを含んでいるからです)。 -
は
vendors
チャンクのフラグはentry
チャンクとしてフラグが立ちますがentry1
とentry2
というチャンクは、フラグを立てずにentry
.
-
他のチャンクで複数回使用されているモジュールを集めます。
-
最後に
vendors
チャンクはentry
チャンクには、ランタイムとjquery
/jquery_plugin
モジュールを使用します。
CASE 3:
-
3つあります。
entry
チャンク (entry1
,entry2
とvendors
). -
コンフィギュレーションでは
vendors
チャンクとmanifest
チャンクを共通のチャンクとする。 -
プラグインが作成する
manifest
チャンクが存在しないので作成します。 -
プラグインは
vendors
共通チャンクを処理します。-
他のチャンクで複数回使用されているモジュールを集めます。
entry1
とentry2
を使うjquery
であるため、これらのチャンクからモジュールが削除されます(モジュールがvendors
チャンクに追加されないことに注意してください。vendors
チャンクはすでにそれを含んでいるからです)。 -
は
vendors
チャンクのフラグはentry
チャンクとしてフラグが立ちますがentry1
とentry2
というチャンクは、フラグを立てずにentry
.
-
他のチャンクで複数回使用されているモジュールを集めます。
-
このプラグインは
manifest
の共通チャンクを処理します(チャンクが存在しないため、作成されます)。- 他のチャンクで複数回使用されているモジュールを収集します。複数回使用されているモジュールがないため、どのモジュールも移動されません。
-
は
manifest
というフラグが立てられます。entry
チャンクであるのに対しentry1
,entry2
とvendors
はフラグが立っていないためentry
.
-
最後に
manifest
チャンクはentry
チャンクであり、ランタイムを含んでいます。
お役に立てれば幸いです。
関連
-
[解決済み] Access-Control-Allow-Originヘッダーはどのように機能するのですか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] オブジェクトが配列であるかどうかを確認するにはどうすればよいですか?[重複]。
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] HTMLマークアップのどこに<script>タグを記述すればよいですか?
-
[解決済み] webpackでjQueryプラグインの依存関係を管理する
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法