Может кто-нибудь объяснить CommonsChunkPlugin Webpack
я понимаю общую суть, что 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запись (some_jquery_plugin)? Из моего понимания, что заCommonsChunkPluginа вот что он собрал общий код (jquery), и так как мы заставили его вывести его наvendorsbundle, это своего рода "слияние" общий код вvendorsbundle (который теперь содержал только код отsome_jquery_plugin). Пожалуйста, подтвердите или объясните.на корпус 3 я не понимаю, что произошло, когда мы проезжали
{ names : ['vendors', 'manifest'] }плагину. Почему / как это былоvendorsсвязка сохранена в целости, содержащая обаjqueryиsome_jquery_plugin, когдаjqueryявно общая зависимость, и почему был сгенерированmanifest.bundle.jsфайл создан так, как он был создан (требуется все остальные пакеты и содержащие время выполнения)?
1 ответ:
это как
CommonsChunkPluginстроительство.общий кусок "получает" модули, совместно используемые несколькими блоками ввода. Хороший пример сложной конфигурации можно найти в папке репозиторий Webpack.
The
CommonsChunkPluginзапускается на этапе оптимизации Webpack, что означает, что он работает в памяти, непосредственно перед тем, как куски запечатываются и записываются на диск.когда несколько общих блоков определены, они обрабатываются внутри порядок. В вашем случае 3, это как запустить плагин дважды. Но обратите внимание, что
CommonsChunkPluginможет иметь более сложную конфигурацию (minSize, minChunks и т. д.), которая влияет на способ перемещения модулей.Пример 1:
- есть 3
entryблоков (entry1,entry2иvendors).- настройки устанавливает
commonsкусок как обычным блоком.- плагин обрабатывает
commonsобщий кусок (так как кусок не существует, он создан):
- он собирает модули, которые используются более одного раза в других кусках:
entry1,entry2иvendorsиспользоватьjqueryтаким образом, модуль удаляется из этих кусков и добавляется вcommonsчанк.- The
commonschunk помечается какentryкусок в то время какentry1,entry2иvendorsкуски не помечены какentry.- наконец-то, так как
commonschunk-этоentryчит содержит время выполнения иjqueryмодуль.Пример 2:
- есть 3
entryблоков (entry1,entry2иvendors).- настройки устанавливает
vendorsкусок как обычным блоком.- плагин обрабатывает
vendorsобщий кусок:
- он собирает модули, которые используются более одного раза в других кусках:
entry1иentry2использоватьjqueryтаким образом, модуль удаляется из эти куски (обратите внимание, что он не добавляется вvendorsкусок, потому чтоvendorsблок уже содержит его).- The
vendorschunk помечается какentryкусок в то время какentry1иentry2куски не помечены какentry.- наконец-то, так как
vendorschunk-этоentrychunk, он содержит время выполнения иjquery/jquery_pluginмодули.дело 3:
- есть 3
entryблоков (entry1,entry2иvendors).- настройки устанавливает
vendorsкусок иmanifestкусок как обычные куски.- плагин создает
manifestкусок, как он не существует.- плагин обрабатывает
vendorsобщий кусок:
- он собирает модули, которые используются более одного раза в других кусках:
entry1иentry2использоватьjqueryтаким образом, модуль удаляется из этих кусков (обратите внимание, что он не добавляется кvendorsкусок, потому чтоvendorsблок уже содержит его).- The
vendorschunk помечается какentryкусок в то время какentry1иentry2куски не помечены какentry.- плагин обрабатывает
manifestcommon chunk (поскольку chunk не существует, он создается):
- он собирает модули, которые используются более одного раза в других блоках: поскольку нет модулей, используемых более одного раза, нет модуля переехал.
- The
manifestchunk помечается какentryкусок в то время какentry1,entry2иvendorsнаходятся непомеченные какentry.- наконец-то, так как
manifestchunk-этоentrychunk он содержит время выполнения.надеюсь, что это помогает.