Dim*_*nis 79 javascript bundle webpack commonschunkplugin webpack-plugin
我得到了通用的要点,即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'
}
...
Run Code Online (Sandbox Code Playgroud)
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,运行时包含在commonsbundle中.相当不错但不理想.
情况2:如果我通过,{ name : 'vendors' }我将得到以下捆绑文件:
entry1.bundle.js其中包含完整的代码entry1.js,需要jquery和不包含运行时entry2.bundle.js其中包含完整的代码entry2.js,需要jquery和不包含运行时vendors.bundle.js它包含来自jquery和的完整代码,some_jquery_plugin并包含运行时.这样,我们最终总体上会得到一些较小的bundle,但运行时现在包含在vendorsbundle中.它比前一种情况稍差,因为运行时现在在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的需求并包含运行时这样我们最终会得到一些较小的bundle,运行时包含在manifestbundle中.这是理想的情况.
在案例2中,为什么我们最终得到vendors包含公共代码(jquery)和vendors条目(some_jquery_plugin)中剩余的内容的包?根据我的理解,CommonsChunkPlugin这里做了什么,它收集了公共代码(jquery),并且因为我们强制它将它输出到vendorsbundle,它将公共代码"合并"到vendorsbundle中(现在只包含来自some_jquery_plugin).请确认或解释.
在案例3中,我不明白当我们传递{ names : ['vendors', 'manifest'] }给插件时发生了什么.为什么/是如何的vendors束保持完好,同时含有jquery和some_jquery_plugin,当jquery显然是一种常见的依赖,以及为什么生成的manifest.bundle.js文件来创建它的创建方式(要求所有其他包和含有运行时)?
Lau*_*ble 103
这是如何CommonsChunkPlugin工作的.
公共块"接收"由多个条目块共享的模块.可以在Webpack存储库中找到复杂配置的一个很好的示例.
它CommonsChunkPlugin在Webpack的优化阶段运行,这意味着它在内存中运行,就在块被密封并写入磁盘之前.
当定义了几个公共块时,它们将按顺序处理.在你的情况3中,它就像运行插件两次.但是请注意,CommonsChunkPlugin可以使用更复杂的配置(minSize,minChunks等)来影响模块的移动方式.
情况1:
entry块(entry1,entry2和vendors).commons块设置为公共块.commons公共块(因为块不存在,它被创建):
entry1,entry2和vendors使用jquery这样的模块从这些块中删除,并加入到该commons块.commons块被标记为entry,而该块entry1,entry2和vendors块是未标记的entry.commons块是一个entry块,它包含运行时和jquery模块.案例2:
entry块(entry1,entry2和vendors).vendors块设置为公共块.vendors公共块:
entry1和entry2使用jquery这样的模块从这些块删除(注意,它不添加到vendors块,因为vendors块已包含它).vendors块被标记为entry,而该块entry1和entry2块是未标记的entry.vendors块是一个entry块,它包含运行时和jquery/ jquery_pluginmodules.案例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块,它包含运行时.希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
8928 次 |
| 最近记录: |