vue-cli2 老项目webpack3升级webpack5过程总结

2023-05-16

文章目录

  • 背景
  • 一、webpack5环境要求
  • 二、升级步骤
    • 1.脚手架webpack-cli
    • 2.升级webpack包
    • 3.更新webpack相关插件
      • 3.1 不推荐或被移除的插件
      • 3.2 升级babel到7版本
      • 3.3 更新插件
    • 4. 修改配置
      • 4.1 新增mode选项
      • 4.2 CommonsChunkPlugin
      • 4.3 module.loaders
      • 4.4 node
      • 4.5 资源模块
      • 4.6 devtool
      • 4.7 修改script启动命令
  • 总结


背景

2018年,用vue-cli2创建的webpack3的老项目。此次将项目进行升级配置,webpack3升级到webpack5~~


一、webpack5环境要求

Webpack 5 对 Node.js 的版本要求至少是 10.13.0 (LTS),因此,如果你还在使用旧版本的 Node.js,请升级它们。

二、升级步骤

1.脚手架webpack-cli

脚手架 (CLI) 已经放至一个单独的 webpack-cli 中。在你使用 webpack 之前需要安装它。

如果你使用 webpack v4+ 版本,并且想要在命令行中调用 webpack,你还需要安装 CLI

npm i webpack-cli --save-dev

2.升级webpack包

升级最新5版本

npm install --save-dev webpack@latest

3.更新webpack相关插件

3.1 不推荐或被移除的插件

  • NamedModulesPlugin ,在开发模式已经默认安装,去除配置
  • extract-text-webpack-plugin 已被移除,由mini-css-extract-plugin插件替代

webpack.pro.config.js

const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // js中的css文件提取出来,生成单独的文件
//...
const webpackConfig = merge(baseWebpackConfig, {
	plugins: [
		//...
		new MiniCssExtractPlugin({
      		filename: utils.assetsPath('css/[name].[contenthash].css'),
      		chunkFilename: utils.assetsPath('css/[name].[contenthash].css')
		})
	]
}

同时在utils.js中修改css-loader配置:

exports.cssLoaders = function (options) {
	// ....
	if (options.extract) {
      return [{loader: MiniCssExtractPlugin.loader}].concat(loaders)
      // -- return ExtractTextPlugin.extract({
      // --  use: loaders,
      // --  fallback: 'vue-style-loader'
      // })
    } else {
      return [{loader: 'vue-style-loader'}].concat(loaders)
      // return ['vue-style-loader'].concat(loaders)
    }
}

注意:在 vue 中,对单文件适用的 css 在 scoped 情况下会附带自己的 hash ( .classname[data-v-hash] ),从而使得 mini-css-extract-plugin 不能实现 css 持久化缓存的功能。

3.2 升级babel到7版本

  • 自Babel 7起,Babel团队改用作用域软件包,使用 @babel 命名空间,如 @babel/core因此您现在必须使用@babel/core而不是babel-core.
  • 但实质上,@babel/core只是babel-core的较新版本.
  • @babel/preset-env 代替 preset-es2015 等,废除 stage-x presets

通过babel升级工具babel-upgrade升级

# 不安装到本地而是直接运行命令,npm 的新功能
npx babel-upgrade --write

可以看到 package.json 中移除了旧版本的依赖,自动新增了新版名称

修改所有 bable-polyfill@babel/polyfill
因为 babel 7 新增的 @babel 命名空间,所以原来的 babel-polyfill 需要修改名称

// main.js 头部导入修改
import '@babel/polyfill'

// webpack.base.config.js 入口修改
entry: ['@babel/polyfill', './src/main.js'],

babel-preset-env 自动变成了@babel/preset-env包,在.babelrc文件中也要做对应修改:

{
  "presets": [
    "@babel/preset-env"
  ],
  "plugins": [
    "transform-vue-jsx", 
    "@babel/plugin-transform-runtime"
  ],
  "comments": false
}

3.3 更新插件

  • webpack-merge
    更新该插件,同时引入方式const merge= require(‘webpack-merge’) 修改为:const { merge }= require('webpack-merge')
npm install --save-dev webpack-merge@5
  • webpack-dev-server
npm install  --save-dev webpack-dev-server@3
  • html-webpack-plugin
npm install  --save-dev html-webpack-plugin@latest
  • copy-webpack-plugin
npm install --save-dev copy-webpack-plugin@latest

更新该插件(用来拷贝static静态文件夹),同时修改配置方式为:

new CopyWebpackPlugin({
      patterns: [{
        from: path.resolve(__dirname, '../static'),
        to: config.dev.assetsSubDirectory,
        globOptions: {
          dot: true,
          gitignore: true,
          ignore: ['.*'],
        }
      }]
    })

4. 修改配置

4.1 新增mode选项

module.exports = {
  mode: 'production',  // 'production', 'development' or '无 (none)'
}

4.2 CommonsChunkPlugin

CommonsChunkPlugin 已被移除。可以使用 optimization.splitChunks 来代替。

移除所有的new webpack.optimize.CommonsChunkPlugin({...})配置实例
替换为:

// 新增插件
npm install --save-dev css-minimizer-webpack-plugin
const TerserWebpackPlugin = require('terser-webpack-plugin');  //如果你使用的是 webpack v5 或以上版本,你不需要安装这个插件。webpack v5 自带最新的 terser-webpack-plugin。如果使用 webpack v4,则必须安装 terser-webpack-plugin v4 的版本。
const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin') 


//...
optimization: {
    minimize: true,
    minimizer: [
      new TerserWebpackPlugin(), // Webpack5自带了开箱即用的代码压缩插件,官方推荐
      new CssMinimizerWebpackPlugin(), // 压缩css代码
    ],
    runtimeChunk: { name: 'runtime' },
    concatenateModules: true,
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendor',
          chunks: 'all',
          priority: -10
        },
        'async-vendors': {
          test: /[\\/]node_modules[\\/]/,
          minChunks: 2,
          chunks: 'async',
          name: 'async-vendors'
        }
      },
    },
    moduleIds: 'deterministic'
  },

4.3 module.loaders

自 webpack 2 后 module.loaders 不推荐使用,目前其已被移除,并推荐使用 module.rules。

webpack.base.config.js

module.exports = {
	// ...
	module: {
		rules: {
        	test: /\.js$/,
--        	loader: 'babel-loader',
++        	use: { loader: 'babel-loader'}
        }
	}
}

4.4 node

如果你使用了类似于 node.fs: ‘empty’,请使用 resolve.fallback.fs: false 代替

4.5 资源模块

如果你定义了 rules,以使用 raw-loader,url-loader 或 file-loader 来加载资源,请使用 资源模块替代,因为它们可能在不久的将来被淘汰。

资源模块详见官网

  • type: "asset/resource" | "asset/inline" | "asset/source" | "asset"
  • parser.dataUrlCondition 可以设置模块资源临界值。如果一个模块源码大小小于 maxSize,那么模块会被作为一个 Base64 编码的字符串注入到包中, 否则模块文件会被生成到输出的目标目录中。
  • generator.filename自定义输出文件名的方式是,将某些资源发送到指定目录

4.6 devtool

config/index.js

// -  devtool: 'cheap-module-eval-source-map',
+  devtool: 'eval-cheap-module-source-map',  // webpack5更严格的选项值校验

4.7 修改script启动命令

 "scripts": {
---    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+++    "dev": "npx webpack serve --config build/webpack.dev.conf.js --color --progress",
    "start": "npm run dev",
    "build": "node build/build.js"
  },


总结

在升级之前,也是参考了众多文档~知识分享的力量
本文如有不足,欢迎留言提出~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-cli2 老项目webpack3升级webpack5过程总结 的相关文章

  • 微信pc端浏览器打开页面空白的问题

    今天写了一个web项目 用chrome浏览器 手机端微信你打开都没问题 但是在pc端微信打开后是空白的 于是我重新做了一个空白的vue项目 用pc端微信浏览器是可以打开的 慢慢调试发现是语法的问题 一步一步减去组件 再一步一步加上组件 最终
  • 上拉加载原理

    实现思路 之前写过一篇触底加载 经过一番苦学钻研 优化一下 样式方面 滚动区域是给固定高度 设置 overflow y auto 来实现 接下来看看js方面的实现 其实也很简单 触发的条件是 可视高度 滚动距离 gt 实际高度 例子我会使用
  • 前端大屏常用的适配方案

    假设我们正在开发一个可视化拖拽的搭建平台 可以拖拽生成工作台或可视化大屏 或者直接就是开发一个大屏 首先必须要考虑的一个问题就是页面如何适应屏幕 因为我们在搭建或开发时一般都会基于一个固定的宽高 但是实际的屏幕可能大小不一 接下来我们就尝试
  • vue prop属性使用方法小结

    Prop 一 基本用法 Prop的基本用法很简单 作用是在子组件中接收父组件的值 父组件传值
  • 基于SpringCloud的分布式网上购物商城

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端 SpringCloud 前端 Vue HTML 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是
  • uni-app项目中使用scss语法

    最近正在学习uni app开发 我先把文档浅略翻了遍 发现组件和接口几乎都是按照微信小程序走 但是视图层上的语法又是按照vue的语法走的 所以开发过程一定要注意这点 然后我想在uni app项目中使用scss语法 但是具体怎么安装呢 历经曲
  • vue实现批量打印

  • Angular 12 升级问题:您可能需要适当的加载器来处理此文件类型,当前没有配置加载器来处理此文件

    我已从 Angular 11 升级到 12 每个 SVG 文件都出现以下错误 错误 模块解析失败 意外的标记 1 0 您可能需要适当的加载程序来处理此文件类型 目前没有配置加载程序来处理此文件 例如 SVG 文件
  • 滚动条样式

    一 在div中的滚动条样式 div webkit scrollbar width 5px 滚动条宽度 div webkit scrollbar thumb border radius 10px 滚动条圆角 webkit box shadow
  • c# asp.net学院学生档案管理系统 计算机毕设源码59121

    摘 要 随着互联网大趋势的到来 社会的方方面面 各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去 而其中最好的方式就是建立网络管理系统 并对其进行信息管理 由于现在网络的发达 学生档案信息通过网络进行管理掀起了热潮 所以针
  • Webpack怎么直接引入webpack.config.babel.js呢?

    我是一个相当大的 ReactJS 项目的新手 在顶层 它确实not有平常的webpack config js 但只有一个 webpack config babel js 这个确实被使用了 我可以在运行时验证 gt webpack 被调用 通
  • 大事件项目07----10,11,12未录

    1 如果三方jar包对应的对象 2 来自第三方 是无法用 Component及衍生注解生命bean的 3 使用Maven命令 引入jar包 4 这里我们准备了jar包 也提前准备好了jar包的脚本 5 通过本地的方式来安装maven的坐标
  • vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

    一 实现效果 使用echarts实现省市地图绘制 根据数据在地图显示柱状图 根据数据显示数据 涟漪效果 二 实现方法 1 安装echarts插件 npm install echarts save 2 获取省市json数据 https dat
  • 基于vue2+海康威视web开发包3.2 无插件版本开发的监控系统

    文章目录 前言 一 插件准备 二 使用步骤 前言 项目最终效果为 可以预览 并且可以使用云台控制 购买的海康威视摄像头必须可以开启websocket 一 插件准备 插件下载地址 下载WEB无插件开发包V3 2 并加入到vue项目中 下载后解
  • Vue3+Echarts:堆积柱状图的绘制

    一 需求 在Vue3项目中 想用Echarts来绘制堆积柱状图 去展示最近一周APP在不同渠道的登录人数 效果如下 二 实现 关于Echarts的下载安装以及图表的样式设计 此处不展开 1 Templates部分
  • 【vue】$bus 跨组件调用方法

    1 新建bus js import Vue from vue 使用 Event Bus const bus new Vue export default bus 2 main js引用 import bus from libs bus Vu
  • 黑豹程序员-字符串中查找出重复的字符串

    Collections frequency codeList element 字符串element 在codeList集合中重复的次数 List
  • Vue3 和Vue2的区别,以及钩子函数的使用

    Vue js 3 和 Vue js 2 是两个主要版本的流行前端框架 它们之间有很多区别 包括性能优化 新特性和改进的API等 以下是一些Vue 3与Vue 2之间的主要区别 以及一些示例代码来说明这些差异 1 性能优化 响应式系统 Vue
  • 使用 webpack 定义全局变量

    是否可以使用 webpack 定义一个全局变量来产生如下结果 var myvar 我看到的所有示例都使用外部文件require imports jquery file js 有几种方法可以处理全局变量 1 将变量放入模块中 Webpack
  • 如何在 Webpack 5 中为 jsonwebtoken 填充缓冲区

    我正在升级到 Webpack 5 并且 jsonwebtoken 包存在问题 https github com auth0 node jsonwebtoken https github com auth0 node jsonwebtoken

随机推荐

  • ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

    成就更好的自己 经过本系列上一篇文章关于PX4 command飞行控制功能包的分析 xff0c 相信大家对于飞整个流程有个大概的了解 xff0c 本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法 关于PX4 command飞行控制
  • USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑

    成就更好的自己 时隔一年再次开始撰写博客 xff0c 这一年的时间经历了很多 xff0c 现在终于稳定下来 以后很长一段时间都能够稳定的学习和更新 时间将会聚焦于USB和PCIe的开发进行 xff0c 能和大家共同进步真的很高兴 本篇为US
  • rosdep init和rosdep update出现问题解决,以及ros编程问题

    如果你在执行 rosdep init 过程中出现以下错误 ERROR cannot download default sources list from https raw githubusercontent com ros rosdist
  • linux内核体系结构

    本节介绍了linux内核的编制模式和体制结构 xff0c 然后详细描述linux内核代码目录中组织形式以及子目录各个代码文件的主要功能以及基本调用的层次关系 一个完整可用的操作系统主要由4部分组成 xff1a 硬件 操作系统内核 操作系统服
  • 基于OpenLTE的4G移动通信网络实验指导书

    基于本人本科毕业设计的成果 xff0c 设计了一套基于开源SDR项目 OpenLTE的实验指导书 xff0c 可以指引读者通过平台源码 平台提供的实验和结合实验对3GPP规范的解读分析来更直观 更多元立体的学习无线通信技术 xff0c 而不
  • 一行代码实现数组中数据频次值

    问题 xff1a 一行代码实现统计数组中每个name出现的次数 数组示例如下 xff1a 期望结果 xff1a 39 哈哈 39 2 39 哈哈1 39 1 39 哈哈2 39 2 span class token keyword var
  • mac bash_profile报错导致所有命令失效解决办法

    项目场景 xff1a 搭建flutter环境时 xff0c 在mac下需要配置环境变量 问题描述 xff1a 配置环境变量 xff0c 需要修改 bash profile文件 xff0c 修改文件保存退出后 发现文件有报错 xff0c 导致
  • 我理解的“大前端”

    前言 随着业务场景越来越复杂 xff0c 前端技术也越来越丰富 xff0c 这几年也迎来爆发期 xff0c 大前端 的概念逐渐涌现 本图根据本人理解整理 xff0c 如有不足 xff0c 欢迎指正 xff0c 感谢 一 终端 PC端 PC端
  • 前端获取用户地理定位的几种方式(Geolocation API,微信,腾讯地图)

    文章目录 前言一 Geolocation API二 微信 SDK1 引入jssdk2 获取签名 xff0c 注入配置3 调用JS SDK api 获取位置 三 第三方服务 xff08 腾讯地图服务 xff09 1 引入js文件2 获取定位
  • H5 软键盘自动搜索功能

    业务场景 xff1a 通常APP中的顶部搜索栏 xff0c 都配一个搜索按钮 同时输入文字软键盘弹起 xff0c 回车键自动变成搜索键 xff0c 点击软键盘中的搜索能进行搜索功能 xff0c 如下图taobao所示 xff1a 思考 软键
  • 基于vue-cli3构建自己的UI库

    文章目录 前言一 创建项目二 编写组件1 button组件2 引入字体图标icon文件3 引入Button组件看效果 三 修改目录结构1 packages文件夹2 打包修改2 demo展示 四 将UI库部署到npm上五 项目使用自己的UI库
  • vue3源码分析(三)—— 响应式系统(reactivity)

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 定义响应式数据1 reactive target 2 createReactiveObject2 1 入参2 2 响应式创建过程2 3 proxy
  • vue3源码分析(四)—— shared工具函数

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言1 数组中移除某元素2 字符串转数字3 转为字符串4 判定值是否发生改变5 判定数据类型5 1 数组5 2 Map5 3 Set5 4 Date5 5
  • 如何将两个rosbag包合并或者提取rosbag包中某些话题到一个rosbag里

    代码叫做merge bag py 运行的时候 python merge bag py v 1028msf bag msf bag vinReNoOutlier bag 就把msf bag和vinReNoOutlier bag完全合并在一起了
  • 解决 vscode中js变量 文件不能自动跳转问题~

    项目场景 xff1a 在项目开发中 xff0c 为了便于理解js代码逻辑和调试 xff0c 通常会使用快捷键自动定位到变量原始定义的文件位置 mac中快捷键 xff1a command 43 鼠标点击 但在vue项目开发中 xff0c 发现
  • vue3源码分析(二)—— 初始化流程

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 createApp在项目中的使用二 createApp源码追溯1 创建app实例1 1 ensureRenderer1 2 ensureRende
  • JS基础 ——解释执行

    文章目录 前言一 词法分析二 预编译创建全局作用域GO对象创建局部作用域AO对象 三 代码执行总结 前言 大家都知道 xff0c JS是一种不需要编译的解释型语言 但其实在浏览器执行JS代码前 xff0c 也有一个词法分析和预编译过程 xf
  • vue 项目中引入字体文件的正确方式~

    文章目录 前言一 开发中需要什么样的字体1 字体图标2 特殊字体 二 项目中引入字体文件1 字体文件2 css文件3 项目使用该字体 总结 前言 在UI设计稿中 xff0c 可能会有一些特殊字体 xff0c 或者是一些字体图标 对于特殊字体
  • vue3 使用 swiper轮播库

    文章目录 前言一 Swiper引入方式1 HTML标签引入方式2 CommonJs引入方式3 ES引入方式 xff08 采用 xff09 二 使用Swiper总结 前言 轮播图在前端开发中 xff0c 是常见需求 而Swiper库是最受前端
  • vue-cli2 老项目webpack3升级webpack5过程总结

    文章目录 背景一 webpack5环境要求二 升级步骤1 脚手架webpack cli2 升级webpack包3 更新webpack相关插件3 1 不推荐或被移除的插件3 2 升级babel到7版本3 3 更新插件 4 修改配置4 1 新增