我得到了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
的完整代码,包含运行时这样我们最终会得到一些较小的bundle,运行时包含在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
,其中包含每个其他包的要求并包含运行时这样我们最终会得到一些较小的bundle,运行时包含在manifest
包中。这是理想的情况。
在 CASE 2 中,为什么我们最终得到包含公共代码(vendors
)的jquery
捆绑包以及vendors
剩余的内容} entry(some_jquery_plugin
)?根据我的理解,CommonsChunkPlugin
在这里所做的是它收集了公共代码(jquery
),并且由于我们强制它将其输出到vendors
包,它有点&# 34;合并" vendors
包中的公共代码(现在只包含some_jquery_plugin
中的代码)。 请确认或解释。
在 CASE 3 中,我不明白当我们将{ names : ['vendors', 'manifest'] }
传递给插件时发生了什么。当vendors
显然是常见的依赖关系时,为什么/如何保持jquery
包保持完整,同时包含some_jquery_plugin
和jquery
,为什么生成的manifest.bundle.js
文件创建方式(需要所有其他包并包含运行时)?
答案 0 :(得分:101)
这就是CommonsChunkPlugin
的工作原理。
公共块“接收”由多个条目块共享的模块。 可以在Webpack repository中找到复杂配置的一个很好的例子。
CommonsChunkPlugin
在Webpack的优化阶段运行,这意味着它在内存中运行,就在密封块被封存并写入磁盘之前。
当定义了几个常见的块时,它们将按顺序处理。在你的情况3中,它就像运行插件两次。但请注意,CommonsChunkPlugin
可能有更复杂的配置(minSize,minChunks等),这会影响模块的移动方式。
案例1:
entry
个块(entry1
,entry2
和vendors
)。commons
块设置为公共块。commons
公共块(因为块不存在,它被创建):
entry1
,entry2
和vendors
使用jquery
,因此模块将从这些块中删除被添加到commons
块。commons
数据块被标记为entry
数据块,entry1
,entry2
和vendors
数据块未标记为entry
。< / LI>
commons
块是entry
块,它包含运行时和jquery
模块。案例2:
entry
个块(entry1
,entry2
和vendors
)。vendors
块设置为公共块。vendors
公共块:
entry1
和entry2
使用jquery
,因此模块将从这些块中删除(请注意,它未添加到vendors
块,因为vendors
块已经包含它。)vendors
块被标记为entry
块,而entry1
和entry2
块未标记为entry
。vendors
块是entry
块,它包含运行时和jquery
/ jquery_plugin
模块。案例3:
entry
个块(entry1
,entry2
和vendors
)。vendors
块和manifest
块设置为公共块。manifest
块,因为它不存在。vendors
公共块:
entry1
和entry2
使用jquery
,因此模块将从这些块中删除(请注意,它未添加到vendors
块,因为vendors
块已经包含它。)vendors
块被标记为entry
块,而entry1
和entry2
块未标记为entry
。manifest
公共块(因为块不存在,它被创建):
manifest
块被标记为entry
块,而entry1
,entry2
和vendors
未标记为entry
。manifest
块是entry
块,它包含运行时。希望它有所帮助。