当前位置: 首页 > news >正文

【构建工具】webpack 3、4 升级指南,摆脱低版本的困扰

一、依赖处理

1.升级通用依赖

借用 ncu 库实现,帮你改写需要升级的package.json 然后再 npm install

ncu -u  <packages> # 可以指定依赖
ncu # 升级全部依赖

大概列了下升级的效果

add-asset-html-webpack-plugin    ^2.1.3  →    ^5.0.2
clean-webpack-plugin            ^0.1.14  →    ^4.0.0
copy-webpack-plugin              ^4.0.1  →   ^11.0.0
css-loader                      ^0.28.7  →    ^6.7.3
es6-promise                      ^4.2.5  →    ^4.2.8
friendly-errors-webpack-plugin   ^1.6.1  →    ^1.7.0
html-webpack-plugin              ^2.2.0  →    ^5.5.0
sass-loader                      ^7.1.0  →   ^13.2.0
vue-loader                      ^13.3.0  →   ^17.0.1
webpack                          ^3.9.0  →   ^5.75.0
webpack-dev-server              ^2.10.0  →   ^4.11.1

2.升级babel依赖

babel 升级工具修改配置

npx babel-upgrade --write# 或是安裝 babel-upgrade 在 global 並執行
npm install babel-upgrade -g
babel-upgrade --write

可以看到 package.json 中移除了旧版本的依赖,自动新增了新版名称,.babelrc 文件的配置也会自动修改 但是不会删除已有的插件

移除旧版本依赖后重新安装依赖

rm -rf node_modules
npm install

修改所有 bable-polyfill@babel/polyfill

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

// index.js 头部导入修改
import '@babel/polyfill'// webpack config 入口修改
entry: ['@babel/polyfill', './src/index.js'],

安装新依赖

  1. mini-csss-extract-plugin 替代 extract-text-webpack-plugin
  2. 添加webpack-cli
  3. vue-loader 需在v15(包含)以下

废除项目中的旧包

// 大概的
url-loader
file-loader
vue-style-loader
extract-text-webpack-plugin
optimize-css-assets-webpack-plugin
clean-webpack-plugin
webpack-hashed-chunk-id-plugin

package.json启动命令修改

webpack-dev-server -> webpack serve

二、plugins及一些依赖使用方式的改变

  • 项目webpack-dev-server升到了4版本用来配套webpack5,所以npm run dev的命令需要相改为webpack serve启动
  • 需要再plugins里面增加VueLoaderPlugin(vue-loader)
  • extract-text-webpack-pluginoptimize-css-assets-webpack-plugin已经过时了需要由mini-css-extract-plugincss-minimizer-webpack-plugin来代替
  • webpack5自带了资源解析,所以不需要什么url-loader,file-loader之类的,直接用assets就可以解析
  • 调整copyWebpackPlugincopy-webpack-plugin)使用方法
  • clean-webpack-plugin 废除,是用webpack5自带的 clean 配置
  • webpack-merge要解构出来,const { merge } = require(‘webpack-merge’)
  • NamedModulesPlugin已过时,由optimization的moduleIds进行替换
  • copy-webpack-plugin插件使用方式有变化
  • devServer改动很多可以参考以上文章链接,自定义参考官网devserver专题
  • UglifyJsPlugin已经过时,可以直接使用webpack5开箱提供的TerserPlugin
  • 代码拆分webpack.optimize.CommonsChunkPlugin已经过时现在使用webpack5提供的optimization.splitChunks属性来实现功能来实现
  • build->util.js文件中修改了一处 MiniCssExtractPlugin.loader。ExtractTextPlugin(extract-text-webpack-plugin)已过时,使用MiniCssExtractPlugin(mini-css-extract-plugin)进行替换。
  • devtool有做一定修改
  • 由于vue-loader升级了,所以之前css如果使用/deep/有可能出错。我是在根节点使用/deep/然后换到::v-deep就正常了。如果有类似问题,可以相应调整。
  • 去掉了vue-style-loader使用style-loader替代。原因css-loader从V4版本开始默认开启esModule,导致css无法被vue-style-loader解析的问题
  • thread-loader 可以支持替换 HappyPack 用法更简单(但是需要注意兼容性问题)

三、配置文件的更改

代码拆分 webpack.optimize.CommonsChunkPlugin 的替代 optimization.splitChunks

optimization: {// 用文件名的 hash 替换打包时候的 ModulesID , 保持 modulesID 不变利于前端持久化moduleIds: 'deterministic',// 抽取出 webpack 的 runtime 代码,避免稍微修改一下入口文件就会改动 commonChunk ,导致原本有效的浏览器缓存失效runtimeChunk: true,splitChunks: {chunks: 'all',cacheGroups: {// 用次数大于等于 2 的模块,单独打包default: {reuseExistingChunk: true,minChunks: 2,priority: -20,filename: webDirName + '/commons/default-[chunkhash:8].js'},// 将所有 node_modules 中的资源单独打包到 vendors-xxx-xx.js 命名的产物defaultVendors: {idHint: 'vendors',reuseExistingChunk: true,test: /[\\/]node_modules[\\/]/i,priority: -10,filename: webDirName + '/commons/defaultVendors-[chunkhash:8].js'}}}}

图片资源 url-loader file-loader 等的替换

// 旧 webpack
{test: /\.(png|svg|jpg|jpeg|gif)(\?.*)?$/i,include: dirConfig.srcDir,loader: 'url-loader',options: {limit: 1024,							// 把小于1kB的文件打成 Base64 的格式,写入 JSname: webDirName + '/images/[name].[hash:8].[ext]',	// 放在文件夹的路径及命名publicPath: '/',						// 路径上添加两个点指向正确路径,cacheDirectory: true}
}
// 新 webpack 5
{test: /\.(png|svg|jpg|jpeg|gif)(\?.*)?$/i,include: dirConfig.srcDir,type: 'asset',generator: {filename: webDirName + '/images/[name].[hash:8].[ext]' // 放在文件夹的路径及命名},parser: {dataUrlCondition: {maxSize: 1024 // 把小于1kB的文件打成 Base64 的格式,写入 JS}}
},

copy-webpack-plugin 用法改变

// 旧
new CopyWebpackPlugin([{from: dirConfig.srcDir + '/temp', // 打包的静态资源目录地址to: path.resolve(dirConfig.buildDir, './' + webDirName + '/temp/'), // 打包到build下面的cssflatten: false}
])// 新
new CopyWebpackPlugin({patterns: [{from: 'temp', // 源路径to: path.resolve(dirConfig.buildDir, './' + webDirName + '/temp/'), // 打包到build下面的csscontext: dirConfig.srcDir // 基础目录}]
})

extract-text-webpack-plugin 替换 mini-css-extract-plugin

// 旧
new ExtractTextPlugin(webDirName + '/css/[name]-[contenthash:8].css')
// 新
new MiniCssExtractPlugin({filename: webDirName + '/css/[name]-[contenthash:8].css' // 设置导出路径和文件名
})

html-webpack-plugin 添加 chunks

chunks: ['defaultVendors', 'default', 'commons']

添加 mode

mode: 'production' | 'development' | 'none'

eslint-loader 替换为 vscodeeslint 实时检查

eslint-loader 是一个 Webpack 插件,赋予其构建时检测代码的功能,但是会影响构建性能

推荐使用,编辑器的 eslint 插件,可以在编辑器中实时检查代码,给出错误和警告提示。这种方式可以帮助开发者在编写代码时及时发现问题,而不需要等待打包过程,不会影响 Webpack 构建性能

相关文章:

【构建工具】webpack 3、4 升级指南,摆脱低版本的困扰

一、依赖处理 1.升级通用依赖 借用 ncu 库实现&#xff0c;帮你改写需要升级的package.json 然后再 npm install ncu -u <packages> # 可以指定依赖 ncu # 升级全部依赖大概列了下升级的效果 add-asset-html-webpack-plugin ^2.1.3 → ^5.0.2 clean-webpack-…...

Javaweb第一个项目——实现简单的登陆功能

第一步&#xff1a;打开idea-->文件-->新建 第二步&#xff1a; 在Demo文件夹 点击右键-->添加框架支持-->找到Web应用程序 勾选 第三步&#xff1a;配置Tomcat 第四步&#xff1a;新建一个lib&#xff08;建在web-INF文件夹下&#xff09;文件夹 用于存放jar包…...

OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

LFX Mentorship 计划由 Linux Foundation 组织发起&#xff0c;为像 OpenKruise 这样的 CNCF 托管项目提供了激励开源贡献、扶植社区发展的优秀土壤。参与其中的开发者不仅有机会在经验丰富的社区 Mentor 指导下贡献开源项目、为职业生涯加分&#xff0c;完成工作后还能获得 $3…...

《c++ primer笔记》第八章 IO库

前言 简单看一下就行 文章目录一、IO类1.1基本概念1.2管理输出缓冲二、文件输入输出2.1文件模式三、string流3.1istringstream3.2ostringstream一、IO类 1.1基本概念 ​ 我们常见的流有istream和ostream&#xff0c;这两个流都是有关输入和输出的&#xff0c;此外&#xff0c…...

web开发 用idea创建一个新项目

这个写着就是给自己当备忘录用的QAQ 这个老师上课一通操作啥也没看清…卑微搞了半天看样子是成功了 记录一下省的以后忘了怎么创建&#xff08;&#xff1f; zufe lxy 2023.3 先行条件是已经自己装好了Tomcat和idea&#xff01;&#xff01;&#xff08;我的idea是申请了教育…...

【FMCW 03】测速

从上一讲 测距 末尾的frame讲起。我们知道一个chirp对应了一个采样后的IF信号&#xff0c;我们将这些采样后的IF信号按chirp的次序排列成一个帧&#xff08;frame&#xff09;&#xff0c;这就得到了我们实际中接收后处理的FMCW信号。 由于chirp的发射返回时间很短&#xff0c;…...

ERP(企业资源管理)概述

&#x1f31f;所属专栏&#xff1a;ERP企业资源管理&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新ERP的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简介&a…...

深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制

深入理解java虚拟机精华总结&#xff1a;性能监控和故障处理工具、类加载机制性能监控和故障处理工具、类加载机制jpsjstatjinfojmapjhatjstackVisualVM类加载机制类加载的时机类加载的过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型破坏双亲委派模型往期内容&am…...

推荐系统与推荐算法

文章目录第一章1.1推荐系统意义与价值1.2推荐系统历史与框架1.3推荐算法分类第二章2.1协同过滤的基本思想与分类2.2基于用户的协同过滤2.3基于项目的协同过滤2.4基于邻域的评分预测2.5基于二部图的协同过滤第三章3.1基于关联规则的推荐3.2基于矩阵分解的评分预测3.3概率矩阵分解…...

socket 编程实战(编写客户端程序 )

编写客户端程序 接着上一篇&#xff1a;实战服务端程序 接下来我们再编写一个简单地客户端应用程序&#xff0c;客户端的功能是连接上小节所实现的服务器&#xff0c;连接成功之后向服务器发送数据&#xff0c;发送的数据由用户输入。示例代码如下所示&#xff1a; #include…...

“巨亏成名”的魔鬼交易员,你知道几个?

谁说在期货市场上只有赚大钱才能出名&#xff1f;殊不知还有这样一群特殊的交易员靠着巨额亏损而“一战成名”&#xff0c;亏得是老东家元气大伤&#xff0c;外号“魔鬼交易员”——“不亏不成魔”&#xff01;接下来火象就给大家盘点几位代表性魔鬼交易员&#xff0c;看看他们…...

1380:分糖果(candy)

1380&#xff1a;分糖果(candy) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 童年的我们&#xff0c;将和朋友分享美好的事物作为自己的快乐。这天&#xff0c;C小朋友得到了Plenty of candies&#xff0c;将要把这些糖果分给要好的朋友们。已知糖果从一个人传…...

数据挖掘(2.1)--数据预处理

一、基础知识 1.数据的基本概念 1.1基础知识 数据是数据对象(Data Objects)及其属性(Attributes)的集合。 数据对象(一条记录、一个实体、一个案例、一个样本等)是对一个事物或者物理对象的描述。 数据对象的属性则是这个对象的性质或特征&#xff0c;例如一个人的肤色、眼球…...

PMP考前冲刺3.06 | 2023新征程,一举拿证

题目1-2&#xff1a;1.一名团队成员表示&#xff0c;他们的用户故事要等到迭代结束后才能完成&#xff0c;因为他们的职能经理要求他们协助解决高优先级的生产问题。项目经理应该做什么&#xff1f;A.将问题上报给项目发起人以解决和调整项目燃尽图B.与产品负责人讨论用户故事不…...

buuctf-pwn write-ups (11)

文章目录buu083-x_ctf_b0verfl0wbuu084-picoctf_2018_leak_mebuu085-inndy_echobuu086-hitcontraining_unlinkbuu087-ciscn_2019_final_3buu088-axb_2019_fmt64buu089-wustctf2020_name_your_catbuu090-pwnme1buu091-axb_2019_brop64buu092-[极客大挑战 2019]Not Badbuu083-x_c…...

【VTK】VTK隐藏vtkOutputWindow窗口的正确方法

VTK隐藏vtkOutputWindow窗口 要求隐藏vtkOutputWindow窗口&#xff0c;但是不能把Warning警告和Error错误的信息都给屏蔽了 网上常见的错误方法&#xff1a; 现在百度搜索出来的方法几乎都是在这样做&#xff1a;在main文件中使用vtkOutputWindow::SetGlobalWarningDisplay(0…...

顺序表以及链表的应用及区别(包含OJ讲解)

前面我已经发过怎么实现链表以及顺序表&#xff0c;今天大概的总结一下。 顺序表&#xff1a; 1.能够随时的存取&#xff0c;比较方便。 2.插入删除时&#xff0c;需要挪动数据&#xff0c;比较麻烦&#xff0c;因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…...

JVM简介

一、什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平…...

Leetcode.1653 使字符串平衡的最少删除次数

题目链接 Leetcode.1653 使字符串平衡的最少删除次数 Rating &#xff1a; 1794 题目描述 给你一个字符串 s&#xff0c;它仅包含字符 a和 b​​​​ 。 你可以删除 s中任意数目的字符&#xff0c;使得 s平衡 。当不存在下标对 (i,j)满足 i < j&#xff0c;且 s[i] b的同…...

leetcode 71~80 学习经历

leetcode 71~80 学习经历71. 简化路径72. 编辑距离73. 矩阵置零74. 搜索二维矩阵75. 颜色分类76. 最小覆盖子串77. 组合78. 子集79. 单词搜索80. 删除有序数组中的重复项 II小结71. 简化路径 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &am…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...