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