vue-webpack4升级

本文介绍如何将基于Vue的项目从Webpack3升级到Webpack4,包括更新依赖包、替换extract-text-webpack-plugin为mini-css-extract-plugin、添加webpack-cli及调整配置等关键步骤。

vue-webpack3x - > webpack4x

  • 先在原来的项目里升级所有的依赖包

npm update
  • 相比webpack3x webpack4x需要多安装一个webpack-cli

npm install webpack-cli
  • 原来删除的extract-text-webpack-plugin使用mini-css-extract-plugin替代

// 使用yarn

yarn remove extract-text-webpack-plugin

yarn add --dev mini-css-extract-plugin

// webpack3x

const ExtractTextPlugin = require('extract-text-webpack-plugin');
if (options.extract) {
  return ExtractTextPlugin.extract({
    use: loaders,
    allback: 'vue-style-loader'
  })
} else {
  return ['vue-style-loader'].concat(loaders)
}
// 改为
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
if (options.extract) {
  return [MiniCssExtractPlugin.loader].concat(loaders)
} else {
  return ['vue-style-loader'].concat(loaders)
}

// webpack.prod.conf.js
const ExtractTextPlugin = require('extract-text-webpack-plugin');
new ExtractTextPlugin({
  filename: utils.assetsPath('css/[contenthash].css')
})
// 改为
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
new MiniCssExtractPlugin({
  filename: utils.assetsPath('css/[contenthash].css')
})
  • webpack.base.conf.js

// 在入口之前 添加 新版webpack强制要求添加,不添加也可以执行,会有警告
module.exports = {
  mode: process.env.NODE_ENV, // development || production || none
  ...
}
  • 针对找不到eslint的报错

// 在webpack.dev.conf.js 和 webpack.prod.conf.js 中的plugins下 添加(只是单纯的添加) 如下配置
new webpack.LoaderOptionsPlugin({ options: {} })
  • 由于新版webpack不支持CommonsChunkPlugin所以需要把相关配置进行换换
new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks: function (module, count) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, '../node_modules')
          ) === 0
        )
      }
}),
new webpack.optimize.CommonsChunkPlugin({
  name: 'manifest',
  chunks: ['vendor']
})

// 把上面的删除了  --- 然后在 plugins 的同级 添加

optimization: {
    runtimeChunk: {
      name: 'manifest'
    },
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendor',
          chunks: 'all'
        }
      }
    }
}

// 后面的这个配置如果配置有误会提示 ERROR in chunk 【你的多页面模块名】 [entry] 报错
  • 安装插件

// 针对代码压缩报错

yarn add --dev uglifyjs-webpack-plugin

new webpack.optimize.UglifyJsPlugin({
  compress: {
    warnings: false
  },
  sourceMap: true
})

// 改为

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

new UglifyJsPlugin({
  uglifyOptions: {
    compress: {
      warnings: false
    }
    },
    sourceMap: true
})

参考资料:

webpack中文网:https ://www.webpackjs.com/
npm官网:https://www.npmjs.com/ 查看新安装的包的使用方法
其他博客:...

<think> 我们面临的问题是:项目同时存在 vue-loader 15.11.1 和 17.4.2 以及 webpack 5.76.0,需要修改配置使项目正常运行。 根据引用[1]和[2]可知,vue-loader v15 是为 Webpack 4 设计的,而 vue-loader v16 及以上是为 Webpack 5 设计的。 因此,我们需要统一版本,要么降级Webpack4,要么升级vue-loader到16以上以适应Webpack 5。 但当前项目中同时存在两个版本的vue-loader(15和17),这会导致冲突。我们需要选择一个方向: 方案一:将项目整体迁移到Webpack 5(使用vue-loader v17) 方案二:将项目降级到Webpack 4(使用vue-loader v15) 考虑到项目已经安装了webpack 5.76.0,且vue-loader 17.4.2也已安装,但可能配置不正确,我们选择方案一(升级)更合理。 然而,引用[4]提到“vue-loader-v16”包,实际上vue-loader v16和v17都是用于Webpack 5的,只是v17是Vue 3专用的,v16同时支持Vue 2和3(但需要额外配置)。但根据引用[5]可知,Vue 2项目使用TypeScript时可能会遇到插件兼容性问题。 因此,我们需要确认项目使用的Vue版本: - 如果是Vue 2项目,应使用vue-loader v15(Webpack4)或vue-loader v16(Webpack5) - 如果是Vue 3项目,必须使用vue-loader v16+ 由于用户的问题描述中同时出现了两个版本的vue-loader,我们首先需要移除冲突的版本,并统一使用一个版本。 步骤: 1. 确定Vue版本: 检查package.json中"vue"的版本: - 2.x.x:Vue 2 - 3.x.x:Vue 3 2. 根据Vue版本决定vue-loader版本: - Vue 2:使用vue-loader v15(配合Webpack4)或vue-loader v16(配合Webpack5) - Vue 3:必须使用vue-loader v16以上(配合Webpack5) 3. 移除现有的vue-loader,安装指定版本。 4. 调整webpack配置。 由于问题描述中同时出现了webpack 5和vue-loader 15(不兼容),所以我们需要调整。 假设项目使用的是Vue 2,我们可以有两种选择: A) 降级webpack4,使用vue-loader 15(如用户之前的问题) B) 升级vue-loader到16,保持webpack5(需要额外配置) 如果项目是Vue 3,则必须使用vue-loader v16以上和webpack5。 考虑到用户之前的问题是关于Webpack4的兼容性,但现在项目已经升级webpack5,我们更倾向于选择方案B(升级vue-loader到16)以保持webpack5。 具体步骤: 1. 移除旧版本vue-loader,安装正确版本: - 如果是Vue2,安装vue-loader v16(最后一个支持Vue2的版本是16.8.3,根据官方文档,16.x支持Vue2和3,但17.x仅支持Vue3) - 如果是Vue3,安装最新版vue-loader(17.x) 2. 更新vue-template-compiler(Vue2)或@vue/compiler-sfc(Vue3) 3. 修改webpack配置,使用VueLoaderPlugin(注意引入方式可能有变化) 4. 确保其他loader兼容Webpack5。 根据引用[2]和[4],我们配置如下: 由于问题中同时存在两个版本,我们先清理: ```bash npm uninstall vue-loader ``` 然后安装对应版本: 情况1:Vue 2项目(使用webpack5) ```bash npm install vue-loader@16.8.3 --save-dev npm install vue-template-compiler --save-dev # 版本必须与vue版本一致 ``` 情况2:Vue 3项目 ```bash npm install vue-loader@17.4.2 --save-dev npm install @vue/compiler-sfc --save-dev # 版本与vue版本一致 ``` 然后在webpack配置中引入插件(注意v16和v17的引入方式相同): ```javascript const { VueLoaderPlugin } = require('vue-loader') module.exports = { // ... 其他配置 module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' }, // 其他规则... ] }, plugins: [ new VueLoaderPlugin() ] } ``` 另外,注意css-loader的版本:Webpack5要求css-loader v5以上,但v6可能会有问题,建议使用v5(如果遇到问题)。引用[3]提到css-loaderstyle-loader的安装。 所以,总结步骤: 1. 查看package.json中vue的版本,确定是Vue2还是Vue3。 2. 卸载现有的vue-loader。 3. 根据Vue版本安装指定版本的vue-loader和编译器。 4. 修改webpack.config.js,确保已正确配置VueLoaderPlugin。 5. 检查其他loader(如css-loaderstyle-loader)是否兼容Webpack5。 注意:如果项目使用TypeScript,引用[5]提到@vue/cli-plugin-typescript可能依赖特定版本的fork-ts-checker-webpack-plugin。如果遇到问题,可能需要降级@vue/cli-plugin-typescript或调整配置。 最后,重新启动项目。 如果选择降级Webpack4(方案A),则步骤如下: 1. 降级webpack4: ```bash npm install webpack@4 webpack-cli@3 webpack-dev-server@3 --save-dev ``` 2. 安装vue-loader 15: ```bash npm install vue-loader@15.9.8 --save-dev ``` 3. 确保vue-template-compiler版本与vue一致。 但是,由于用户已经安装了webpack5,且项目可能已经使用了webpack5的特性,降级可能会有额外风险。 因此,我们优先推荐方案B(升级vue-loader)以适应webpack5。 注意:vue-loader v16和v17的配置基本相同,但vue-loader v17需要配合@vue/compiler-sfc(Vue3),而vue-loader v16配合vue-template-compiler(Vue2)或@vue/compiler-sfc(Vue3)。 由于用户的问题中没有明确Vue版本,我们需要用户自行确认。以下配置假设为Vue2(因为vue-template-compiler是Vue2的编译器): 如果package.json中vue是2.x,则执行: ```bash # 移除现有的vue-loader npm uninstall vue-loader # 安装vue-loader v16(兼容Vue2和Webpack5) npm install vue-loader@16.8.3 --save-dev # 确保vue-template-compiler版本与vue一致,例如vue是2.6.14,则: npm install vue-template-compiler@2.6.14 --save-dev ``` 然后修改webpack配置,确保已经使用了VueLoaderPlugin(如上所示)。 同时,检查其他loader的兼容性,特别是css-loaderstyle-loader。对于Webpack5,css-loader可以使用v5或v6,但style-loader需要v2以上(推荐v3.3.1)。如果遇到问题,可以尝试: ```bash npm install css-loader@5.2.7 style-loader@2.0.0 --save-dev ``` 最后,重新运行项目。 如果项目是Vue3,则执行: ```bash npm uninstall vue-loader npm install vue-loader@17.4.2 --save-dev npm install @vue/compiler-sfc@3.2.47 --save-dev # 版本与vue一致 ``` 注意:Vue3不需要vue-template-compiler,而是使用@vue/compiler-sfc。 如果遇到其他插件问题(如fork-ts-checker-webpack-plugin),可能需要根据引用[5]的提示降级@vue/cli-plugin-typescript或等待兼容版本。 由于问题描述中没有提到TypeScript,我们可以先不考虑。 因此,关键步骤总结: 1. 确定Vue版本 2. 安装对应的vue-loader和编译器 3. 配置webpack 4. 确保其他loader兼容 根据引用[2]的配置示例,我们确保在webpack配置中正确引入了VueLoaderPlugin并配置了.vue文件的loader。 如果还有问题,请检查控制台错误信息,可能需要调整其他loaderplugin的版本。 </think> 要解决项目中 `vue-loader` 15.11.1 与 17.4.2、`webpack` 5.76.0 共存导致的冲突问题,请按以下步骤操作: --- ### 🔧 解决方案:统一 vue-loader 版本 #### 步骤1:移除冲突依赖 ```bash # 移除当前冲突的 vue-loader 版本 npm uninstall vue-loader # 安装兼容 Webpack 5 的 vue-loader v16(Vue 2 项目) npm install vue-loader@16.8.3 --save-dev # 或 Vue 3 项目使用 npm install vue-loader@17.4.2 --save-dev ``` #### 步骤2:安装必要依赖 ```bash # Vue 2 项目 npm install vue-template-compiler@^2.6.14 --save-dev # Vue 3 项目 npm install @vue/compiler-sfc@^3.2.0 --save-dev ``` #### 步骤3:修改 webpack 配置 ```javascript title="webpack.config.js" const { VueLoaderPlugin } = require('vue-loader'); module.exports = { //... module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { /* Vue 2 需要此配置 */ } }, { test: /\.css$/, use: ['vue-style-loader', 'css-loader'] } ] }, plugins: [ new VueLoaderPlugin() // 必须添加[^2] ], resolve: { alias: { // Vue 2 需要此别名 vue$: 'vue/dist/vue.esm.js' } } }; ``` --- ### ⚠️ 关键兼容性配置 | 依赖 | Vue 2 项目 | Vue 3 项目 | |------------------|-------------------------------|-------------------------------| | vue-loader | `16.8.3` (兼容 Vue 2 & Webpack 5) | `17.4.2` (仅支持 Vue 3) | | 编译器 | `vue-template-compiler@2.6.14` | `@vue/compiler-sfc@3.2.47` | | Vue 别名 | `vue$: 'vue/dist/vue.esm.js'` | 不需要 | | CSS 加载器 | `vue-style-loader` + `css-loader@5` | `vue-style-loader` + `css-loader` | --- ### ✅ 验证步骤 1. **检查依赖树**: ```bash npm list vue-loader webpack vue-template-compiler ``` 2. **Vue 版本匹配验证**: ```javascript title="version-check.js" console.log('Vue版本:', require('vue/package.json').version) console.log('编译器版本:', require('vue-template-compiler/package.json').version) ``` 3. **运行构建**: ```bash npx webpack --mode development ``` --- ### 🚫 常见错误修复 1. **`VueLoaderPlugin` 未定义**: ```javascript // 错误写法 const VueLoaderPlugin = require('vue-loader/lib/plugin') // 正确写法 const { VueLoaderPlugin } = require('vue-loader') ``` 2. **组件渲染错误**: ```javascript // 在 webpack 别名中添加 resolve: { alias: { 'vue$': 'vue/dist/vue.esm.js' // Vue 2 必须配置 } } ``` 3. **样式加载失败**: ```bash npm install css-loader@5.2.7 style-loader@2.0.0 --save-dev ``` > **关键原则**: > - Vue 2 项目必须使用 `vue-loader` v16,**不能使用 v17**[^4] > - Vue 2 必须配对 `vue-template-compiler` 且版本严格等于 Vue 版本 > - Webpack 5 需要 CSS loader v5+[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值