迁移到webpack4:从webpack.optimize.CommonsChunkPlugin到config.optimization.splitChunk,以及有个搜出来的中文解决办法是错的

本文记录了在使用Webpack 4过程中遇到的CommonsChunkPlugin移除问题及解决方案,详细介绍了如何通过optimization.splitChunks配置实现代码拆分。

今天在对着webpack中文指南一点点敲demo,在代码分离这一节遇到了一个报错:

webpack4 Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead

哦,原来是原来的插件不能用了,这个中文指南,标的是webpack4.7.0,结果这块都没更新啊。。。于是必应搜了一下,第一个出来的是这个

webpack4 Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead 的解决方法

照着在webpack.config.js改了一下代码:

  module.exports = {
    plugins: [
-     new webpack.optimize.CommonsChunkPlugin({
-       name: 'common' // 指定公共 bundle 的名称。
-     })
    ],

+   optimization: {
+     splitChunks: {
+       name: 'common'
+     }
+   },

倒是不报错了,但仔细检查了一下,发现结果是:

//app.bundle.js 和 another.bundle.js 是共享 lodash模块的
                Asset       Size  Chunks             Chunk Names
    another.bundle.js   70.1 KiB       0  [emitted]  another
        app.bundle.js   70.2 KiB       1  [emitted]  app
another.bundle.js.map    668 KiB       0  [emitted]  another
    app.bundle.js.map    668 KiB       1  [emitted]  app
           index.html  253 bytes          [emitted]  

app.bundle.js 和 another.bundle.js 的大小都在70kib左右(1kib = 1,024Byte),相差无几且都大得不对劲,而且common.js根本没有生出来啊。。。这绝壁是有问题吧!!!

返回去老老实实看官方文档吧。。。

果然,是要这么配滴:

//optimization与entry/plugins同级
optimization: {
        splitChunks: {
            cacheGroups: {
                commons: {
                    name: "commons",
                    chunks: "initial",
                    minChunks: 2
                }
            }
        }
    },

稍微解释一下含义

  • cacheGroups is an object where keys are the cache group names. All options from the ones listed above are possible: chunks, minSize, minChunks, maxAsyncRequests, maxInitialRequests, name. 可以自己设置一组一组的cache group来配对应的共享模块
  • commons里面的name就是生成的共享模块bundle的名字
  • With the chunks option the selected chunks can be configured.
    chunks 有三个可选值,”initial”, “async” 和 “all”. 分别对应优化时只选择初始的chunks,所需要的chunks 还是所有chunks 。
  • minChunks 是split前,有共享模块的chunks的最小数目 ,默认值是1, 但我看示例里的代码在default里把它重写成2了,从常理上讲,minChunks = 2 应该是一个比较合理的选择吧。

出来的结果是:

                Asset       Size  Chunks             Chunk Names
    commons.bundle.js   69.5 KiB       0  [emitted]  commons
    another.bundle.js   1.21 KiB       1  [emitted]  another
        app.bundle.js   1.26 KiB       2  [emitted]  app
commons.bundle.js.map    664 KiB       0  [emitted]  commons
another.bundle.js.map    6.9 KiB       1  [emitted]  another
    app.bundle.js.map   7.31 KiB       2  [emitted]  app
           index.html  317 bytes          [emitted]  

很明显这才是对的嘛~

对了,那个回答在某个叫skip的社区上,已经有4964浏览量了。。。。不得不觉得有点误人子弟啊。。。

<think>嗯,用户遇到了Webpack中OccurenceOrderPlugin不是构造函数的TypeError误。我需要先回忆一下相关引用中的解决方法。引用1和3提到过类似的问题,比如VueLoaderPlugin和cleanWebpackPlugin的问题,都是导出方式或导入语句的问题。比如,应该用解构赋值或者添加.default。引用4提到HashedModuleIdsPlugin的替代方法,直接配置optimization.moduleIds,可能Webpack版本升级导致插件用法变化。 首先,用户的问题是关于OccurenceOrderPlugin的,这个插件在Webpack的哪个版本有变化呢?我记得Webpack 4之后很多插件移到了CLI或者配置结构变化了。可能用户升级了Webpack版本,但还在用旧版的插件用法。比如,OccurenceOrderPlugin在Webpack 4中被废弃了,推荐使用optimization的配置项。 所以解决方案应该是检查Webpack版本,如果版本>=4,就不需要手动引入这个插件,而是通过optimization配置。如果用户还在用旧版,可能需要调整导入方式,比如使用解构或者.default。同时,引用中的例子显示,导入方式误会导致类似的误,所以应该检查导入语句是否正确,是否需要解构或者添加.default。 另外,用户可能需要更新配置文件,使用新的优化选项替代旧插件。比如,在Webpack配置中添加optimization: { occurrenceOrder: true },这样可以替代原来的插件。同时,提醒用户检查Webpack和相关loader的版本兼容性,确保所有依赖项都是兼容的,避免类似问题发生。 总结一下,可能的解决步骤是:1. 检查Webpack版本,升级到兼容版本;2. 调整配置文件,使用新的optimization配置代替旧插件;3. 确保导入语句正确,可能需要解构或添加.default;4. 更新依赖项保证兼容性。同时,需要参考用户提供的引用中的类似问题解决方法,给出具体的代码示例和步骤说明。</think>### Webpack `OccurenceOrderPlugin` 报解决方案 #### 问题分析 当出现 `TypeError: webpack.optimize.OccurenceOrderPlugin is not a constructor` 时,通常与以下原因相关: 1. **Webpack 版本升级**:Webpack 4+ 已弃用 `OccurenceOrderPlugin`,直接使用会导致语法不兼容[^4]。 2. **导入语法误**:若仍使用旧版本 Webpack,插件导入方式可能不正确(如未解构或缺少 `.default`)[^1][^3]。 3. **配置方式过时**:新版 Webpack 推荐通过 `optimization` 配置项替代插件[^4]。 --- #### 解决步骤 1. **检查 Webpack 版本** - 若使用 Webpack 4+,**无需手动引入插件**,直接通过配置 `optimization` 实现功能: ```javascript // webpack.config.js module.exports = { optimization: { occurrenceOrder: true, // 替代 OccurenceOrderPlugin }, }; ``` - 若需保留旧版 Webpack(如 Webpack 3),需验证插件导入方式: ```javascript // 旧版本正确导入方式 const webpack = require('webpack'); // 使用 new webpack.optimize.OccurrenceOrderPlugin() ``` 2. **修正插件导入语法(仅限旧版 Webpack)** - 若导入时缺少解构或 `.default`,可能触发构造函数误: ```javascript // 误示例 const OccurrenceOrderPlugin = require('webpack').optimize.OccurrenceOrderPlugin; // 正确示例(解构语法) const { optimize: { OccurrenceOrderPlugin } } = require('webpack'); ``` 3. **更新依赖版本** - 确保 `webpack`、`vue-loader` 等核心库版本兼容: ```bash npm install webpack@latest --save-dev ``` --- #### 代码示例(旧版兼容) ```javascript // Webpack 3 配置文件 const webpack = require('webpack'); module.exports = { plugins: [ new webpack.optimize.OccurrenceOrderPlugin(), // 注意正确拼写 "Occurrence" ], }; ``` --- #### 关键点总结 - **新版 Webpack**:优先使用 `optimization: { occurrenceOrder: true }`。 - **旧版语法**:检查插件名称拼写(如 `Occurrence` 而非 `Occurence`)和导入方式[^1][^3]。 - **版本控制**:通过 `package.json` 锁定版本或升级至兼容版本。 ---
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值