【发布时间】:2017-01-25 16:01:40
【问题描述】:
我知道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包中。这是理想的情况。 -
我不明白/我不确定我是否明白
在 CASE 2 中,为什么我们最终会得到包含公共代码 (
jquery) 和vendors条目 (some_jquery_plugin) 中剩余的任何内容的vendors包)?据我了解,CommonsChunkPlugin在这里所做的是它收集了公共代码 (jquery),并且由于我们强制它输出到vendors包,它有点将公共代码“合并”到vendors捆绑包(现在只包含来自some_jquery_plugin的代码)。 请确认或解释。在 CASE 3 中,当我们将
{ names : ['vendors', 'manifest'] }传递给插件时,我不明白发生了什么。为什么/如何保持vendors捆绑包保持原样,同时包含jquery和some_jquery_plugin,而jquery显然是一个常见的依赖项,以及为什么生成的manifest.bundle.js文件按照它的创建方式创建(需要所有其他包并包含运行时)?
【问题讨论】:
-
对于案例 1,我认为您应该指定 minChunks 属性。
-
从您的问题中我学到了很多,非常感谢!
-
非常感谢您提出这个问题并解决我一直以来对这个插件的困惑❤
-
也许有人知道,这些示例在 Webpack 4 中会是什么样子?
标签: javascript webpack bundle webpack-plugin commonschunkplugin