我大致了解到,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
,我们不希望出现这种情况。
如果我使用CommonsChunkPlugin
进行捆绑
根据我传递给CommonsChunkPlugin
的参数,将发生以下情况之一:
CASE 1 : 如果我传递
{ name : 'commons' }
,我最终将得到以下捆绑文件:entry1.bundle.js
包含entry1.js
的完整代码和jquery
,不包含运行时entry2.bundle.js
包含entry2.js
的完整代码和jquery
,不包含运行时vendors.bundle.js
包含some_jquery_plugin
的完整代码,并且不包含运行时commons.bundle.js
包含jquery
的完整代码并包含运行时
这样我们最终得到了一些更小的捆绑文件,而运行时包含在
commons
捆绑文件中。这还可以,但不理想。CASE 2 : 如果我传递
{ name : 'vendors' }
,我最终将得到以下捆绑文件:entry1.bundle.js
包含entry1.js
的完整代码和jquery
,不包含运行时entry2.bundle.js
包含entry2.js
的完整代码和jquery
,不包含运行时vendors.bundle.js
包含jquery
和some_jquery_plugin
的完整代码,并包含运行时。
这样,我们最终得到了一些更小的捆绑文件,但是运行时现在包含在
vendors
捆绑文件中。这比上一个情况稍微糟糕一些,因为现在运行时位于vendors
捆绑文件中。CASE 3 : 如果我传递
{ names : ['vendors', 'manifest'] }
,我最终将得到以下捆绑文件:entry1.bundle.js
包含entry1.js
的完整代码和jquery
,不包含运行时entry2.bundle.js
包含entry2.js
的完整代码和jquery
,不包含运行时- <