Может кто-нибудь объяснить 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
требование дляjq,uery
и не содержит времени выполнения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
как бы "слил" общий код вvendors
расслоение (которое теперь содержит только код изsome_jquery_plugin
).Пожалуйста, подтвердите или объясните.
ВДЕЛО 3 Я не понимаю, что случилось, когда мы прошли{ names : ['vendors', 'manifest'] }
к плагину. Почему / какvendors
пакет остался неповрежденным, содержащий обаjquery
а такжеsome_jquery_plugin
, когдаjquery
явно общая зависимость, и почему был созданmanifest.bundle.js
файл создан так, как он был создан (требующий все другие пакеты и содержащий среду выполнения)?