Tôi nhận được ý chính chung là CommonsChunkPlugin
xem xét tất cả các điểm nhập, kiểm tra xem có các gói / phụ thuộc chung giữa chúng hay không và tách chúng thành gói riêng của chúng.
Vì vậy, giả sử tôi có cấu hình sau:
...
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'
}
...
Nếu tôi gói mà không sử dụng CommonsChunkPlugin
Tôi sẽ kết thúc với 3 tệp gói mới:
entry1.bundle.js
chứa mã hoàn chỉnh từentry1.js
vàjquery
và chứa thời gian chạy của chính nóentry2.bundle.js
chứa mã hoàn chỉnh từentry2.js
vàjquery
và chứa thời gian chạy của chính nóvendors.bundle.js
chứa mã hoàn chỉnh từjquery
vàsome_jquery_plugin
và chứa thời gian chạy của chính nó
Điều này rõ ràng là không tốt vì tôi có thể sẽ tải jquery
3 lần trong trang, vì vậy chúng tôi không muốn điều đó.
Nếu tôi gói bằng cách sử dụng CommonsChunkPlugin
Tùy thuộc vào đối số mà tôi chuyển cho CommonsChunkPlugin
bất kỳ đối số nào sau đây sẽ xảy ra:
TRƯỜNG HỢP 1: Nếu tôi vượt qua,
{ name : 'commons' }
tôi sẽ kết thúc với các tệp gói sau:entry1.bundle.js
chứa mã hoàn chỉnh từentry1.js
, một yêu cầu chojquery
và không chứa thời gian chạyentry2.bundle.js
chứa mã hoàn chỉnh từentry2.js
, một yêu cầu chojquery
và không chứa thời gian chạyvendors.bundle.js
chứa mã hoàn chỉnh từsome_jquery_plugin
, một yêu cầu chojquery
và không chứa thời gian chạycommons.bundle.js
chứa mã hoàn chỉnh từjquery
và chứa thời gian chạy
Bằng cách này, chúng tôi kết thúc với một số gói nhỏ hơn về tổng thể và thời gian chạy được chứa trong
commons
gói. Khá ổn nhưng không lý tưởng.TRƯỜNG HỢP 2: Nếu tôi vượt qua,
{ name : 'vendors' }
tôi sẽ kết thúc với các tệp gói sau:entry1.bundle.js
chứa mã hoàn chỉnh từentry1.js
, một yêu cầu chojquery
và không chứa thời gian chạyentry2.bundle.js
chứa mã hoàn chỉnh từentry2.js
, một yêu cầu chojquery
và không chứa thời gian chạyvendors.bundle.js
trong đó chứa mã hoàn chỉnh từjquery
vàsome_jquery_plugin
và chứa thời gian chạy.
Bằng cách này, một lần nữa, chúng tôi kết thúc với một số gói nhỏ hơn về tổng thể nhưng thời gian chạy hiện được chứa trong
vendors
gói. Nó tệ hơn một chút so với trường hợp trước, vì thời gian chạy hiện đã nằm trongvendors
gói.TRƯỜNG HỢP 3: Nếu tôi vượt qua,
{ names : ['vendors', 'manifest'] }
tôi sẽ kết thúc với các tệp gói sau:entry1.bundle.js
chứa mã hoàn chỉnh từentry1.js
, một yêu cầu chojquery
và không chứa thời gian chạyentry2.bundle.js
chứa mã hoàn chỉnh từentry2.js
, một yêu cầu chojquery
và không chứa thời gian chạyvendors.bundle.js
trong đó chứa mã hoàn chỉnh từjquery
vàsome_jquery_plugin
và không chứa thời gian chạymanifest.bundle.js
chứa các yêu cầu cho mọi gói khác và chứa thời gian chạy
Bằng cách này, chúng tôi kết thúc với một số gói nhỏ hơn về tổng thể và thời gian chạy được chứa trong
manifest
gói. Đây là trường hợp lý tưởng.
Điều tôi không hiểu / tôi không chắc mình hiểu
Trong CASE 2 tại sao chúng ta kết thúc với
vendors
gói chứa cả mã chung (jquery
) và bất cứ thứ gì còn lại từvendors
mục nhập (some_jquery_plugin
)? Theo hiểu biết của tôi, điềuCommonsChunkPlugin
đã làm ở đây là nó tập hợp mã chung (jquery
) và vì chúng tôi buộc nó phải xuất nó ravendors
gói, nên nó đã "hợp nhất" mã chung vàovendors
gói (bây giờ chỉ chứa mã từsome_jquery_plugin
). Vui lòng xác nhận hoặc giải thích.Trong TRƯỜNG HỢP 3, tôi không hiểu điều gì đã xảy ra khi chúng tôi chuyển
{ names : ['vendors', 'manifest'] }
sang plugin. Tại sao / làm thế nàovendors
gói được giữ nguyên vẹn, chứa cả haijquery
vàsome_jquery_plugin
, khi nàojquery
rõ ràng là một phần phụ thuộc chung và tại saomanifest.bundle.js
tệp được tạo được tạo theo cách nó được tạo (yêu cầu tất cả các gói khác và chứa thời gian chạy)?