Rozumiem, że patrzę CommonsChunkPlugin
na 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.js
która zawiera kompletny kodentry1.js
ijquery
i zawiera swój własny czas pracyentry2.bundle.js
która zawiera kompletny kodentry2.js
ijquery
i zawiera swój własny czas pracyvendors.bundle.js
która zawiera kompletny kodjquery
isome_jquery_plugin
i zawiera swój własny czas pracy
Jest to oczywiście złe, ponieważ potencjalnie załaduję stronę jquery
3 razy, więc tego nie chcemy.
Jeśli połączę za pomocą CommonsChunkPlugin
W zależności od tego, jakie argumenty przekażę do CommonsChunkPlugin
któregokolwiek z poniższych:
PRZYPADEK 1: Jeśli zdam
{ name : 'commons' }
, skończę z następującymi plikami w pakiecie:entry1.bundle.js
który zawiera pełny kod zentry1.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegoentry2.bundle.js
który zawiera pełny kod zentry2.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegovendors.bundle.js
który zawiera pełny kod zsome_jquery_plugin
, wymógjquery
i nie zawiera środowiska uruchomieniowegocommons.bundle.js
który zawiera pełny kod zjquery
i zawiera środowisko wykonawcze
W ten sposób otrzymujemy ogólnie kilka mniejszych pakietów, a środowisko wykonawcze jest zawarte w
commons
pakiecie. Całkiem ok, ale nie idealne.PRZYPADEK 2: Jeśli zdam
{ name : 'vendors' }
, otrzymam następujące pliki pakietu:entry1.bundle.js
który zawiera pełny kod zentry1.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegoentry2.bundle.js
który zawiera pełny kod zentry2.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegovendors.bundle.js
która zawiera kompletny kodjquery
isome_jquery_plugin
oraz zawiera środowisko wykonawcze.
W ten sposób ponownie otrzymujemy ogólnie kilka mniejszych pakietów, ale środowisko wykonawcze jest teraz zawarte w
vendors
pakiecie. Jest trochę gorzej niż w poprzednim przypadku, ponieważ środowisko wykonawcze znajduje się teraz wvendors
pakiecie.PRZYPADEK 3: Jeśli zdam
{ names : ['vendors', 'manifest'] }
, otrzymam następujące pliki pakietu:entry1.bundle.js
który zawiera pełny kod zentry1.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegoentry2.bundle.js
który zawiera pełny kod zentry2.js
, wymógjquery
i nie zawiera środowiska uruchomieniowegovendors.bundle.js
który zawiera pełny kod zijquery
isome_jquery_plugin
nie zawiera środowiska wykonawczegomanifest.bundle.js
któ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
manifest
pakiecie. To jest idealny przypadek.
Czego nie rozumiem / nie jestem pewien, czy rozumiem
W przypadku 2 Dlaczego skończyć z
vendors
pakietu zawierającego zarówno wspólny kod (jquery
) i co pozostało zvendors
wejściem (some_jquery_plugin
)? Z mojego zrozumieniaCommonsChunkPlugin
wynika, że w tym przypadku zebrał wspólny kod (jquery
), a ponieważ zmusiliśmy go do wyprowadzenia go dovendors
pakietu, w pewnym sensie „scalił” wspólny kod zvendors
pakietem (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óbvendors
pakiet został zachowany w stanie nienaruszonym, zawierający obie,jquery
asome_jquery_plugin
kiedyjquery
jest wyraźnie wspólną zależnością i dlaczego wygenerowanymanifest.bundle.js
plik został utworzony w taki sposób, w jaki został utworzony (wymagający wszystkich innych pakietów i zawierający środowisko wykonawcze)?