Я розумію загальну суть того, що 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і містить власний час виконання
Це, очевидно, погано, тому що я потенційно завантажуватиму jquery3 рази на сторінці, тому ми цього не хочемо.
Якщо я зв’язую з використанням 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комплекті. Це ідеальний випадок.
Що я не розумію / я не впевнений, що розумію
Чому у CASE 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файл був створений так, як він був створений (вимагаючи всіх інших наборів та містять час виконання)?