Я понимаю, что он 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
который содержит полный кодentry1.js
, является требованиемjquery
и не содержит среду выполненияentry2.bundle.js
который содержит полный кодentry2.js
, является требованиемjquery
и не содержит среду выполненияvendors.bundle.js
который содержит полный кодsome_jquery_plugin
, является требованиемjquery
и не содержит среду выполненияcommons.bundle.js
который содержит полный кодjquery
и содержит среду выполнения
Таким образом, мы получаем несколько меньших пакетов в целом, а среда выполнения содержится в
commons
пакете. Довольно хорошо, но не идеально.СЛУЧАЙ 2: Если я пройду, у
{ name : 'vendors' }
меня будут следующие файлы пакета:entry1.bundle.js
который содержит полный кодentry1.js
, является требованиемjquery
и не содержит среду выполненияentry2.bundle.js
который содержит полный кодentry2.js
, является требованиемjquery
и не содержит среду выполненияvendors.bundle.js
который содержит полный код изjquery
иsome_jquery_plugin
и содержит среду выполнения.
Таким образом, мы снова получаем несколько меньших пакетов в целом, но среда выполнения теперь содержится в
vendors
пакете. Это немного хуже, чем в предыдущем случае, так как среда выполнения теперь находится вvendors
комплекте.СЛУЧАЙ 3: Если я проиграю, у
{ names : ['vendors', 'manifest'] }
меня будут следующие файлы пакета:entry1.bundle.js
который содержит полный кодentry1.js
, является требованиемjquery
и не содержит среду выполненияentry2.bundle.js
который содержит полный кодentry2.js
, является требованиемjquery
и не содержит среду выполненияvendors.bundle.js
который содержит полный код изjquery
иsome_jquery_plugin
и не содержит среду выполненияmanifest.bundle.js
который содержит требования для всех остальных пакетов и среду выполнения
Таким образом, мы получаем несколько меньших пакетов в целом, а среда выполнения содержится в
manifest
пакете. Это идеальный случай.
Что я не понимаю / не уверен, что понимаю
В СЛУЧАЕ 2 почему мы получили
vendors
пакет, содержащий как общий код (jquery
), так и все, что осталось отvendors
entry (some_jquery_plugin
)? Насколько я понимаю,CommonsChunkPlugin
он собирал общий код (jquery
), и, поскольку мы заставили его выводить его вvendors
пакет, он как бы «слил» общий код сvendors
пакетом (который теперь содержал только код изsome_jquery_plugin
). Подтвердите или объясните.В СЛУЧАЕ 3 я не понимаю, что произошло, когда мы перешли
{ names : ['vendors', 'manifest'] }
к плагину. Почему / как был сохраненvendors
пакет без изменений, содержащий обаjquery
иsome_jquery_plugin
, когдаjquery
явно является общей зависимостью, и почему сгенерированныйmanifest.bundle.js
файл был создан таким образом, как он был создан (требуя все другие пакеты и содержащий среду выполнения)?