Я понимаю общий смысл, что 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
, произойдет одно из следующего:
СЛУЧАЙ 1. Если я пройду
{ name : 'commons' }
, я получу следующие файлы пакета:entry1.bundle.js
which contains the complete code fromentry1.js
, a requirement forjquery
and does not contain the runtimeentry2.bundle.js
, который содержит полный код изentry2.js
, требование дляjquery
и не содержит среды выполненияvendors.bundle.js
, который содержит полный код изsome_jquery_plugin
, требование дляjquery
и не содержит среды выполненияcommons.bundle.js
, который содержит полный код изjquery
и содержит среду выполнения
Таким образом, мы получим в целом несколько меньших пакетов, а среда выполнения будет содержаться в пакете
commons
. Вполне нормально, но не идеально.СЛУЧАЙ 2. Если я пропущу
{ name : 'vendors' }
, я получу следующие файлы пакета:entry1.bundle.js
which contains the complete code fromentry1.js
, a requirement forjquery
and does not contain the runtimeentry2.bundle.js
, который содержит полный код изentry2.js
, является требованием дляjquery
и не содержит среды выполнения.vendors.bundle.js
, который содержит полный код изjquery
иsome_jquery_plugin
и содержит среду выполнения.
Таким образом, опять же, мы получим в целом несколько меньших пакетов, но среда выполнения теперь содержится в пакете
vendors
. Это немного хуже, чем в предыдущем случае, так как среда выполнения теперь находится в комплектеvendors
.СЛУЧАЙ 3. Если я пропущу
{ names : ['vendors', 'manifest'] }
, я получу следующие файлы пакета:entry1.bundle.js
which contains the complete code fromentry1.js
, a requirement forjquery
and does not contain the runtimeentry2.bundle.js
, который содержит полный код изentry2.js
, требование дляjquery
и не содержит среды выполненияvendors.bundle.js
, который содержит полный код изjquery
иsome_jquery_plugin
и не содержит среды выполненияmanifest.bundle.js
, который содержит требования для всех остальных пакетов и содержит среду выполнения
Таким образом, мы получаем в целом несколько меньших пакетов, а среда выполнения содержится в пакете
manifest
. Это идеальный случай.
Что я не понимаю / я не уверен, что понимаю
Почему в СЛУЧАЕ 2 мы получили пакет
vendors
, содержащий как общий код (jquery
), так и то, что осталось от записиvendors
(some_jquery_plugin
)? Насколько я понимаю,CommonsChunkPlugin
здесь собирал общий код (jquery
), и поскольку мы заставили его выводить его в пакетvendors
, он как бы "слил" общий код в пакетvendors
(который теперь только содержал код отsome_jquery_plugin
). Подтвердите или объясните.В СЛУЧАЕ 3 я не понимаю, что произошло, когда мы передали
{ names : ['vendors', 'manifest'] }
подключаемому модулю. Почему/как пакетvendors
был сохранен нетронутым, содержащим какjquery
, так иsome_jquery_plugin
, когдаjquery
явно является общей зависимостью, и почему сгенерированный файлmanifest.bundle.js
был создан так, как он был создан (требующий всех других пакетов и содержащий среду выполнения)?