Я понимаю, что он 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
файл был создан таким образом, как он был создан (требуя все другие пакеты и содержащий среду выполнения)?
источник
Ответы:
Вот как это
CommonsChunkPlugin
работает.Общий блок "получает" модули, общие для нескольких блоков входа. Хороший пример сложной конфигурации можно найти в репозитории Webpack .
Он
CommonsChunkPlugin
запускается на этапе оптимизации Webpack, что означает, что он работает в памяти, непосредственно перед тем, как блоки будут запечатаны и записаны на диск.Когда определены несколько общих блоков, они обрабатываются по порядку. В вашем случае 3 это похоже на запуск плагина дважды. Но обратите внимание, что у них
CommonsChunkPlugin
может быть более сложная конфигурация (minSize, minChunks и т. Д.), Которая влияет на способ перемещения модулей.СЛУЧАЙ 1:
entry
блока (entry1
,entry2
иvendors
).commons
чанк как общий.commons
общий чанк (поскольку чанк не существует, он создается):entry1
,entry2
иvendors
использоватьjquery
таким образом , модуль удаляется из этих кусков и добавляется вcommons
блок.commons
Кусок помечен какentry
кусок в то время какentry1
,entry2
иvendors
куски , как unflaggedentry
.commons
фрагмент являетсяentry
фрагментом, он содержит среду выполнения иjquery
модуль.СЛУЧАЙ 2:
entry
блока (entry1
,entry2
иvendors
).vendors
чанк как общий.vendors
общий чанк:entry1
иentry2
использует,jquery
чтобы модуль был удален из этих фрагментов (обратите внимание, что он не добавляется вvendors
фрагмент, потому чтоvendors
чанк уже содержит его).vendors
Кусок помечен какentry
кусок в то время какentry1
иentry2
куски , как unflaggedentry
.vendors
блок являетсяentry
блоком, он содержит среду выполнения иjquery
/jquery_plugin
modules.СЛУЧАЙ 3:
entry
блока (entry1
,entry2
иvendors
).vendors
фрагмент иmanifest
фрагмент как общие фрагменты.manifest
чанк, поскольку он не существует.vendors
общий чанк:entry1
иentry2
используетjquery
так, чтобы модуль был удален из этих чанков (обратите внимание, что он не добавляется вvendors
чанк, потому чтоvendors
чанк уже содержит его).vendors
Кусок помечен какentry
кусок в то время какentry1
иentry2
куски , как unflaggedentry
.manifest
общий чанк (поскольку чанк не существует, он создается):manifest
Кусок помечен какentry
кусок в то времяentry1
,entry2
иvendors
являются unflagged , какentry
.manifest
фрагмент являетсяentry
фрагментом, он содержит среду выполнения.Надеюсь, поможет.
источник
{ names : ['vendors', 'manifest'] }
похож на запуск его дважды, один раз с{ name : 'vendors' }
и один раз с{ name : 'manifest' }
, правильно? 3) Когда мы говорим «Плагин обрабатывает общий фрагмент», мы имеем в виду, что он создает содержимое, которое будет вставлять вbundle.js
файл, в памяти, правильно? 4) Пока он не «обработал все общие куски», он вообще не записал никаких выходных данных в файл, он все в памятиentry1.js
иentry2.js
между ними был другой общий файл, кромеjquery
файла, назовем егоownLib.js
. В СЛУЧАЕ 2 и СЛУЧАЕ 3ownLib.js
окажется ли вvendors.bundle.js
правильном? Как бы вы сделали так, чтобы общие файлы, отличные от файлов поставщиков, были разделены на отдельные фрагменты, кромеvendors
фрагментов? Извините за беспокойство, но я все еще изучаю, как использовать webpackownLib.js
будет помещен в первый общий блок. Если вы хотите , чтобы собрать общие зависимости в другом chunck, вы должны пройти что - то вроде этого:{ names : ['common', 'vendors', 'manifest'] }
.