我得到了一个基本要点,即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。这是理想的情况。
我不了解/不确定我是否了解
在案例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文件以创建方式创建(需要所有其他捆绑包并包含运行时)?