Ich verstehe allgemein, dass CommonsChunkPluginalle Einstiegspunkte überprüft werden, ob gemeinsame Pakete / Abhängigkeiten zwischen ihnen bestehen, und sie in ein eigenes Bundle aufteilen.
Nehmen wir also an, ich habe die folgende Konfiguration:
...
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'
}
...
Wenn ich ohne Verwendung bündle CommonsChunkPlugin
Ich werde mit 3 neuen Bundle-Dateien enden:
entry1.bundle.jsdie enthält den vollständigen Code ausentry1.jsundjqueryund enthält eine eigene Laufzeitentry2.bundle.jsdie enthält den vollständigen Code ausentry2.jsundjqueryund enthält eine eigene Laufzeitvendors.bundle.jsdie enthält den vollständigen Code ausjqueryundsome_jquery_pluginund enthält eine eigene Laufzeit
Das ist offensichtlich schlecht, weil ich möglicherweise jquerydreimal auf die Seite laden werde , also wollen wir das nicht.
Wenn ich mit bündle CommonsChunkPlugin
Abhängig davon, welche Argumente ich an CommonsChunkPlugineines der folgenden Argumente weitergebe, geschieht Folgendes:
FALL 1: Wenn ich bestanden habe, erhalte
{ name : 'commons' }ich die folgenden Bundle-Dateien:entry1.bundle.jsDies enthält den vollständigen Code vonentry1.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitentry2.bundle.jsDies enthält den vollständigen Code vonentry2.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitvendors.bundle.jsDies enthält den vollständigen Code vonsome_jquery_plugin, eine Anforderung fürjqueryund enthält nicht die Laufzeitcommons.bundle.jswelches den vollständigen Code vonjqueryund die Laufzeit enthält
Auf diese Weise erhalten wir insgesamt einige kleinere Bundles und die Laufzeit ist im
commonsBundle enthalten. Ziemlich ok, aber nicht ideal.FALL 2: Wenn ich bestanden habe, erhalte
{ name : 'vendors' }ich die folgenden Bundle-Dateien:entry1.bundle.jsDies enthält den vollständigen Code vonentry1.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitentry2.bundle.jsDies enthält den vollständigen Code vonentry2.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitvendors.bundle.jsdie enthält den vollständigen Code ausjqueryundsome_jquery_pluginund enthält die Laufzeit.
Auf diese Weise erhalten wir wieder einige kleinere Bundles insgesamt, aber die Laufzeit ist jetzt im
vendorsBundle enthalten. Es ist etwas schlimmer als im vorherigen Fall, da die Laufzeit jetzt imvendorsBundle enthalten ist.FALL 3: Wenn ich bestanden habe, erhalte
{ names : ['vendors', 'manifest'] }ich die folgenden Bundle-Dateien:entry1.bundle.jsDies enthält den vollständigen Code vonentry1.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitentry2.bundle.jsDies enthält den vollständigen Code vonentry2.js, eine Anforderung fürjqueryund enthält nicht die Laufzeitvendors.bundle.jswelches den vollständigen Code vonjqueryund enthältsome_jquery_pluginund nicht die Laufzeit enthältmanifest.bundle.jsDies enthält Anforderungen für jedes andere Bundle und die Laufzeit
Auf diese Weise erhalten wir insgesamt einige kleinere Bundles und die Laufzeit ist im
manifestBundle enthalten. Dies ist der Idealfall.
Was ich nicht verstehe / Ich bin nicht sicher, ob ich es verstehe
Warum haben wir in FALL 2 das
vendorsBundle erhalten, das sowohl den gemeinsamen Code (jquery) als auch alles enthält, was vomvendorsEintrag (some_jquery_plugin) übrig geblieben ist ? Nach meinem Verständnis hat dasCommonsChunkPluginhier den gemeinsamen Code (jquery) gesammelt , und da wir ihn gezwungen haben, ihn in dasvendorsBundle auszugeben , hat es den gemeinsamen Code in dasvendorsBundle "zusammengeführt" (das jetzt nur den Code von enthält)some_jquery_plugin). Bitte bestätigen oder erklären.In Fall 3 verstehe ich nicht, was passiert ist, als wir
{ names : ['vendors', 'manifest'] }zum Plugin übergegangen sind . Warum / wie wurde dasvendorsBundle intakt gehalten, das beides enthielt,jqueryundsome_jquery_pluginwannjqueryist eindeutig eine gemeinsame Abhängigkeit, und warum wurde die generiertemanifest.bundle.jsDatei so erstellt, wie sie erstellt wurde (alle anderen Bundles erforderlich und die Laufzeit enthalten)?