Ich verstehe allgemein, dass CommonsChunkPlugin
alle 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.js
die enthält den vollständigen Code ausentry1.js
undjquery
und enthält eine eigene Laufzeitentry2.bundle.js
die enthält den vollständigen Code ausentry2.js
undjquery
und enthält eine eigene Laufzeitvendors.bundle.js
die enthält den vollständigen Code ausjquery
undsome_jquery_plugin
und enthält eine eigene Laufzeit
Das ist offensichtlich schlecht, weil ich möglicherweise jquery
dreimal auf die Seite laden werde , also wollen wir das nicht.
Wenn ich mit bündle CommonsChunkPlugin
Abhängig davon, welche Argumente ich an CommonsChunkPlugin
eines der folgenden Argumente weitergebe, geschieht Folgendes:
FALL 1: Wenn ich bestanden habe, erhalte
{ name : 'commons' }
ich die folgenden Bundle-Dateien:entry1.bundle.js
Dies enthält den vollständigen Code vonentry1.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitentry2.bundle.js
Dies enthält den vollständigen Code vonentry2.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitvendors.bundle.js
Dies enthält den vollständigen Code vonsome_jquery_plugin
, eine Anforderung fürjquery
und enthält nicht die Laufzeitcommons.bundle.js
welches den vollständigen Code vonjquery
und die Laufzeit enthält
Auf diese Weise erhalten wir insgesamt einige kleinere Bundles und die Laufzeit ist im
commons
Bundle enthalten. Ziemlich ok, aber nicht ideal.FALL 2: Wenn ich bestanden habe, erhalte
{ name : 'vendors' }
ich die folgenden Bundle-Dateien:entry1.bundle.js
Dies enthält den vollständigen Code vonentry1.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitentry2.bundle.js
Dies enthält den vollständigen Code vonentry2.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitvendors.bundle.js
die enthält den vollständigen Code ausjquery
undsome_jquery_plugin
und enthält die Laufzeit.
Auf diese Weise erhalten wir wieder einige kleinere Bundles insgesamt, aber die Laufzeit ist jetzt im
vendors
Bundle enthalten. Es ist etwas schlimmer als im vorherigen Fall, da die Laufzeit jetzt imvendors
Bundle enthalten ist.FALL 3: Wenn ich bestanden habe, erhalte
{ names : ['vendors', 'manifest'] }
ich die folgenden Bundle-Dateien:entry1.bundle.js
Dies enthält den vollständigen Code vonentry1.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitentry2.bundle.js
Dies enthält den vollständigen Code vonentry2.js
, eine Anforderung fürjquery
und enthält nicht die Laufzeitvendors.bundle.js
welches den vollständigen Code vonjquery
und enthältsome_jquery_plugin
und nicht die Laufzeit enthältmanifest.bundle.js
Dies 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
manifest
Bundle enthalten. Dies ist der Idealfall.
Was ich nicht verstehe / Ich bin nicht sicher, ob ich es verstehe
Warum haben wir in FALL 2 das
vendors
Bundle erhalten, das sowohl den gemeinsamen Code (jquery
) als auch alles enthält, was vomvendors
Eintrag (some_jquery_plugin
) übrig geblieben ist ? Nach meinem Verständnis hat dasCommonsChunkPlugin
hier den gemeinsamen Code (jquery
) gesammelt , und da wir ihn gezwungen haben, ihn in dasvendors
Bundle auszugeben , hat es den gemeinsamen Code in dasvendors
Bundle "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 dasvendors
Bundle intakt gehalten, das beides enthielt,jquery
undsome_jquery_plugin
wannjquery
ist eindeutig eine gemeinsame Abhängigkeit, und warum wurde die generiertemanifest.bundle.js
Datei so erstellt, wie sie erstellt wurde (alle anderen Bundles erforderlich und die Laufzeit enthalten)?