Rozumiem, że patrzę CommonsChunkPluginna wszystkie punkty wejścia, sprawdza, czy istnieją między nimi wspólne pakiety / zależności i rozdziela je do własnego pakietu.
Załóżmy więc, że mam następującą konfigurację:
...
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'
}
...
Jeśli spakuję bez użycia CommonsChunkPlugin
Skończy się na 3 nowych plikach pakietu:
entry1.bundle.jsktóra zawiera kompletny kodentry1.jsijqueryi zawiera swój własny czas pracyentry2.bundle.jsktóra zawiera kompletny kodentry2.jsijqueryi zawiera swój własny czas pracyvendors.bundle.jsktóra zawiera kompletny kodjqueryisome_jquery_plugini zawiera swój własny czas pracy
Jest to oczywiście złe, ponieważ potencjalnie załaduję stronę jquery3 razy, więc tego nie chcemy.
Jeśli połączę za pomocą CommonsChunkPlugin
W zależności od tego, jakie argumenty przekażę do CommonsChunkPluginktóregokolwiek z poniższych:
PRZYPADEK 1: Jeśli zdam
{ name : 'commons' }, skończę z następującymi plikami w pakiecie:entry1.bundle.jsktóry zawiera pełny kod zentry1.js, wymógjqueryi nie zawiera środowiska uruchomieniowegoentry2.bundle.jsktóry zawiera pełny kod zentry2.js, wymógjqueryi nie zawiera środowiska uruchomieniowegovendors.bundle.jsktóry zawiera pełny kod zsome_jquery_plugin, wymógjqueryi nie zawiera środowiska uruchomieniowegocommons.bundle.jsktóry zawiera pełny kod zjqueryi zawiera środowisko wykonawcze
W ten sposób otrzymujemy ogólnie kilka mniejszych pakietów, a środowisko wykonawcze jest zawarte w
commonspakiecie. Całkiem ok, ale nie idealne.PRZYPADEK 2: Jeśli zdam
{ name : 'vendors' }, otrzymam następujące pliki pakietu:entry1.bundle.jsktóry zawiera pełny kod zentry1.js, wymógjqueryi nie zawiera środowiska uruchomieniowegoentry2.bundle.jsktóry zawiera pełny kod zentry2.js, wymógjqueryi nie zawiera środowiska uruchomieniowegovendors.bundle.jsktóra zawiera kompletny kodjqueryisome_jquery_pluginoraz zawiera środowisko wykonawcze.
W ten sposób ponownie otrzymujemy ogólnie kilka mniejszych pakietów, ale środowisko wykonawcze jest teraz zawarte w
vendorspakiecie. Jest trochę gorzej niż w poprzednim przypadku, ponieważ środowisko wykonawcze znajduje się teraz wvendorspakiecie.PRZYPADEK 3: Jeśli zdam
{ names : ['vendors', 'manifest'] }, otrzymam następujące pliki pakietu:entry1.bundle.jsktóry zawiera pełny kod zentry1.js, wymógjqueryi nie zawiera środowiska uruchomieniowegoentry2.bundle.jsktóry zawiera pełny kod zentry2.js, wymógjqueryi nie zawiera środowiska uruchomieniowegovendors.bundle.jsktóry zawiera pełny kod zijqueryisome_jquery_pluginnie zawiera środowiska wykonawczegomanifest.bundle.jsktóry zawiera wymagania dla każdego innego pakietu i zawiera środowisko wykonawcze
W ten sposób otrzymujemy ogólnie kilka mniejszych pakietów, a środowisko wykonawcze jest zawarte w
manifestpakiecie. To jest idealny przypadek.
Czego nie rozumiem / nie jestem pewien, czy rozumiem
W przypadku 2 Dlaczego skończyć z
vendorspakietu zawierającego zarówno wspólny kod (jquery) i co pozostało zvendorswejściem (some_jquery_plugin)? Z mojego zrozumieniaCommonsChunkPluginwynika, że w tym przypadku zebrał wspólny kod (jquery), a ponieważ zmusiliśmy go do wyprowadzenia go dovendorspakietu, w pewnym sensie „scalił” wspólny kod zvendorspakietem (który teraz zawierał tylko kod zsome_jquery_plugin). Potwierdź lub wyjaśnij.W PRZYPADKU 3 nie rozumiem, co się stało, gdy przeszliśmy
{ names : ['vendors', 'manifest'] }do wtyczki. Dlaczego / w jaki sposóbvendorspakiet został zachowany w stanie nienaruszonym, zawierający obie,jqueryasome_jquery_pluginkiedyjqueryjest wyraźnie wspólną zależnością i dlaczego wygenerowanymanifest.bundle.jsplik został utworzony w taki sposób, w jaki został utworzony (wymagający wszystkich innych pakietów i zawierający środowisko wykonawcze)?