Tôi nhận được ý chính chung là CommonsChunkPluginxem 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.jschứa mã hoàn chỉnh từentry1.jsvàjqueryvà chứa thời gian chạy của chính nóentry2.bundle.jschứa mã hoàn chỉnh từentry2.jsvàjqueryvà chứa thời gian chạy của chính nóvendors.bundle.jschứa mã hoàn chỉnh từjqueryvàsome_jquery_pluginvà 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 jquery3 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 CommonsChunkPluginbấ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.jschứa mã hoàn chỉnh từentry1.js, một yêu cầu chojqueryvà không chứa thời gian chạyentry2.bundle.jschứa mã hoàn chỉnh từentry2.js, một yêu cầu chojqueryvà không chứa thời gian chạyvendors.bundle.jschứa mã hoàn chỉnh từsome_jquery_plugin, một yêu cầu chojqueryvà không chứa thời gian chạycommons.bundle.jschứa mã hoàn chỉnh từjqueryvà 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
commonsgó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.jschứa mã hoàn chỉnh từentry1.js, một yêu cầu chojqueryvà không chứa thời gian chạyentry2.bundle.jschứa mã hoàn chỉnh từentry2.js, một yêu cầu chojqueryvà không chứa thời gian chạyvendors.bundle.jstrong đó chứa mã hoàn chỉnh từjqueryvàsome_jquery_pluginvà 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
vendorsgó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 trongvendorsgó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.jschứa mã hoàn chỉnh từentry1.js, một yêu cầu chojqueryvà không chứa thời gian chạyentry2.bundle.jschứa mã hoàn chỉnh từentry2.js, một yêu cầu chojqueryvà không chứa thời gian chạyvendors.bundle.jstrong đó chứa mã hoàn chỉnh từjqueryvàsome_jquery_pluginvà không chứa thời gian chạymanifest.bundle.jschứ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
manifestgó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
vendorsgói chứa cả mã chung (jquery) và bất cứ thứ gì còn lại từvendorsmụ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ó ravendorsgói, nên nó đã "hợp nhất" mã chung vàovendorsgó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àovendorsgói được giữ nguyên vẹn, chứa cả haijqueryvàsome_jquery_plugin, khi nàojqueryrõ ràng là một phần phụ thuộc chung và tại saomanifest.bundle.jstệ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)?