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