Может кто-нибудь объяснить 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
), и так как мы заставили его вывести его наvendors
bundle, это своего рода "слияние" общий код вvendors
bundle (который теперь содержал только код от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
commons
chunk помечается какentry
кусок в то время какentry1
,entry2
иvendors
куски не помечены какentry
.- наконец-то, так как
commons
chunk-этоentry
чит содержит время выполнения иjquery
модуль.Пример 2:
- есть 3
entry
блоков (entry1
,entry2
иvendors
).- настройки устанавливает
vendors
кусок как обычным блоком.- плагин обрабатывает
vendors
общий кусок:
- он собирает модули, которые используются более одного раза в других кусках:
entry1
иentry2
использоватьjquery
таким образом, модуль удаляется из эти куски (обратите внимание, что он не добавляется вvendors
кусок, потому чтоvendors
блок уже содержит его).- The
vendors
chunk помечается какentry
кусок в то время какentry1
иentry2
куски не помечены какentry
.- наконец-то, так как
vendors
chunk-этоentry
chunk, он содержит время выполнения иjquery
/jquery_plugin
модули.дело 3:
- есть 3
entry
блоков (entry1
,entry2
иvendors
).- настройки устанавливает
vendors
кусок иmanifest
кусок как обычные куски.- плагин создает
manifest
кусок, как он не существует.- плагин обрабатывает
vendors
общий кусок:
- он собирает модули, которые используются более одного раза в других кусках:
entry1
иentry2
использоватьjquery
таким образом, модуль удаляется из этих кусков (обратите внимание, что он не добавляется кvendors
кусок, потому чтоvendors
блок уже содержит его).- The
vendors
chunk помечается какentry
кусок в то время какentry1
иentry2
куски не помечены какentry
.- плагин обрабатывает
manifest
common chunk (поскольку chunk не существует, он создается):
- он собирает модули, которые используются более одного раза в других блоках: поскольку нет модулей, используемых более одного раза, нет модуля переехал.
- The
manifest
chunk помечается какentry
кусок в то время какentry1
,entry2
иvendors
находятся непомеченные какentry
.- наконец-то, так как
manifest
chunk-этоentry
chunk он содержит время выполнения.надеюсь, что это помогает.