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