一、调研

对比维度

Webpack 4 状态

Webpack 5 改进与优势

构建速度

较慢,增量构建效率低

✅ 引入 持久化缓存(filesystem cache),二次构建速度提升高达 90%

Tree Shaking

支持基础 Tree Shaking,需手动配置

✅ 更强的 Tree Shaking + 默认启用 SideEffects,删除无用代码更彻底

代码分割

需手动配置 CommonsChunkPlugin

自动拆分 chunk,内置 SplitChunksPlugin,无需额外插件

模块联邦

❌ 不支持

✅ 支持 Module Federation,实现微前端、跨应用模块共享

资源处理

需手动配置 file-loader/url-loader

✅ 内置 Asset Modules,直接处理图片、字体等资源,无需额外 loader

缓存机制

需额外安装 cache-loaderhard-source

✅ 内置 持久化缓存,自动生效,开发体验大幅提升

压缩优化

需手动配置 uglifyjs-webpack-plugin

✅ 默认使用 terser-webpack-plugin,压缩更快、体积更小

现代语法支持

❌ 不支持 top-level await、WebAssembly 等

✅ 支持 top-level awaitWebAssemblyJSON 模块

Node.js 兼容性

✅ 支持 Node.js 6、8、9

❗ 要求 Node.js ≥ 10.13.13,移除旧版本支持

配置简化

❌ 配置繁琐,需手动优化

✅ 默认启用多项优化,配置更简洁,开箱即用

总的来说,webpack5相对于webpack4具有更好的构建性能、热更新和tree shaking,并且基于rust的rspack在业界也在迅速扩展,在构建性能上rspack甚至比webpack可以提升百分之八十,并且webpack5可以几乎无痛迁移rspack,故升级webpack对于未来可能迁移到其他更好的构建工具也是一种提前准备。

目前 微前端、组件库、国际化、权限系统……每加一个功能,构建时间就会变得越来越长,特别是很多公司在配合 CI/CD 的逻辑,每构建跑一次可能就得跑 2 分钟,而如果换成 rspack 那么就只要 15 秒上下了,你算算整个团队每天省下多少时间?

二、升级

这里采取的方案是一点点进行升级,保证正常打包运行的情况下进行排查问题,因为之前尝试过直接全部一次性弄好,但是出现了很多预期之外的问题并且也很难定位到具体插件或者代码。

1.准备工作

  • Node.js版本至少需要Node.js 10.13.0
  • 升级升级webpack-cli到最新可用版本
  • 将所有使用的插件和加载器升级到最新可用版本

这是经过搜索和验证可以正常运行之后更新的插件加载器等

插件/加载器

老版本

新版本

babel-loader

8.0.0

8.3.0

compression-webpack-plugin

1.1.12

6.1.2

copy-webpack-plugin

5.0.4

5.1.2

html-webpack-plugin": "^"

3.2.0

4.5.2

mini-css-extract-plugin

0.8.0

1.6.2

optimize-css-assets-webpack-plugin

5.0.3

5.0.8

terser-webpack-plugin

1.4.1

4.2.3

ts-loader

6.0.4

8.4.0

注意我们webpack有三个文件

文件

作用

何时使用

备注

webpack.base.config.js

公共基础配置(loader、alias、插件等)

始终被合并

不区分 dev/prod,只放通用规则

webpack.dev.config.js

开发环境 专用配置

npm run start

启用 dev-server、HMR、source-map、代理、懒编译

webpack.prod.config.js

生产环境 专用配置

npm run build

开启压缩、source-map、CDN 路径、清理 dist、优化分包

2.测试webpack5兼容性

module.exports = {node:{Buffer:false,process:false},
...
}

我们会发现加了上面的代码之后运行会出现process is not defined,说明验证成功,这里是webpack4的schema检查生效了,webpack5默认为false

3.开始升级

升级中出现的问题很多,需要一个个进行排查测试,这里只列出了常见的方法与问题,有一些简单处理的并没有罗列

升级版本

首先执行命令吧核心的几个进行升级,这是执行升级命令之后的前后版本对比

web merge升级

webpack-merge升级后使用方式改为如下

修改前
const webpackMerge = require("webpack-merge");
修改后
const { merge } = require('webpack-merge');
修改devtool

这里先用tnpm run start测试dev文件,然后根据报错信息修改如下

修改devtool

定义process

webpack5相对于webpack4改变比较大的一点就是不能直接用Bufferprocess,要改用resolve.fallback来提供polyfill

所以我们先删除原来文件直接使用的process,然后再用defineplugin进行引用定义

更新caniuse-lite

tnpm update-browserslist-db@latest

更新配置项

把proxy对象改成数组

删除happypack

webpack5已经封装了多线程打包,并且并不兼容happypack,所以我们需要删除happypack

删除happypack,改用webpack原生loader+thread-loader实现多线程打包

这里直接使用thread-loader和babel-loader进行处理即可

兼容性问题

如果Webpack 5 中 thread-loaderbabel-loader 联合使用时出现不兼容

直接在use配置项中删除一个即可

命名大小写冲突问题

这里是文件名大小写的报错,webpack5禁止两个仅大小写不同的文件,否则会触发竞态条件和文件损坏

后续我尝试全局搜出冲突的源文件

find src -iname '*messagetemplate*' -type f

发现搜不到,说明不是源码目录里面的同名文件

那就直接看dist里面文件,发现也没有同名文件

再扩大范围,在所有文件中搜索大小写不敏感的messagetemplate文件

grep -r -i 'messagetemplate' . --exclude-dir=.git --exclude-dir=node_modules --exclude-dir=dist

现这样的信息,ai分析后发现是路由懒加载里面出现了两份大小写不同的webpackChunkName

因为两者导入不同,所以直接讲两个都换一个名字就好了

至此运行大致没问题,但是还有很多warning和相关报错

三、处理警告

end值兼容性问题

我们在 Less/CSS 中使用了 align-items: endjustify-content: end 等属性值。虽然现代浏览器支持 end,但为了更好的兼容性(尤其是旧版浏览器),PostCSS 提示改用更通用的 flex-end

v-for缺少key

找到对应的v-for加上key即可

样式引入顺序问题

这些 Warning 全是 mini-css-extract-plugin 报的「样式引入顺序冲突」警告

目前看来样式并没有受到影响,解决方案为统一引入全局样式、避免重复import、合并css chunk等,但是比较繁琐,且不确定到底会不会影响,以前是否也出现过但是不影响,所以这里在插件导入的时候使用ignoreOrder: true来进行屏蔽警告

四、build升级

进行拆包并且限制包的最大最小体积

开启压缩

五、测试

经过测试工具,启动速度稳定在三秒以内,打包速度在50秒左右

这里还有部分包体积过大需要拆分,还可以进行打包速度优化

但是webpack只能拆包,这里可能需要吧部分例如echarts、tinymce用CDN引入

六、迁移RSpack

启动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95304.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95304.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95304.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Logstash数据迁移之es-to-kafka.conf详细配置

在 Logstash 中配置从 Elasticsearch (ES) 读取数据并输出到 Kafka 是一个相对高级但强大的用法,通常用于数据迁移、重新索引、或构建新的数据管道。 下面我将详细解释配置文件的各个部分和细节。 核心配置文件结构 (es-to-kafka.conf) 一个完整的配置文件主要包含三…

在OracleLinux9.4系统上静默滚动打补丁安装Oracle19c

OracleLinux9.4系统 安装Oracle19c 文章目录OracleLinux9.4系统 安装Oracle19c一、安装准备1、yum安装预检查需要的包2、系统资源二、滚动安装一、安装准备 1、yum安装预检查需要的包 yum install libnsl yum install -y oracle-database-preinstall-19c # 最新的unzip yum i…

Android原生HttpURLConnection上传图片方案

创建上传方法object FormUploader {private val BOUNDARY "Boundary-" System.currentTimeMillis()private const val LINE_FEED "\r\n"Throws(IOException::class)fun uploadImage(url: String, imageFile: File, params: MutableMap<String?, Str…

落叶清扫机器人cad+三维图+设计说明书

摘 要 城市公共场所、校园等环境中&#xff0c;落叶的清扫一直是一个繁琐而耗时的任务。传统的人工清扫方式不仅效率低下&#xff0c;还存在人力浪费和安全隐患等问题。因此&#xff0c;研发一款能够自主完成落叶清扫任务的机器人成为了当今研究的热点之一。随着科技的不断进…

国别域名的SEO优势:是否更利于在当地搜索引擎排名?

当你盯着搜索引擎结果页发呆时&#xff0c;有没有想过——凭什么那个.jp域名的网站能排在.ca前面&#xff1f;别扯什么内容质量&#xff0c;上周帮客户优化新加坡市场时&#xff0c;亲眼见着两个内容相似度90%的页面&#xff0c;.sg域名比.com.au在Google Singapore上高出3个排…

动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)

作为一名Spring Boot开发者&#xff0c;正在运维一个高可用微服务系统&#xff1a;业务需求变化频繁&#xff0c;需要实时调整配置如数据库连接或日志级别&#xff0c;但每次修改都得重启应用&#xff0c;造成服务中断和用户投诉。这不是小麻烦&#xff0c;而是配置管理的痛点—…

vue社区网格化管理系统(代码+数据库+LW)

摘要 随着城市化进程的加快&#xff0c;社区管理的复杂性逐渐增大&#xff0c;传统的管理模式已无法满足现代社区管理的需求。社区网格化管理系统作为一种新的管理模式&#xff0c;通过将社区划分为多个网格单元&#xff0c;使得管理更加精细化、智能化和高效化。本论文基于Sp…

使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行

使用EasyExcel实现Excel单元格保护&#xff1a;锁定表头和第二行数据 前言 在日常开发中&#xff0c;我们经常需要导出Excel文件&#xff0c;有时还需要对Excel中的某些单元格进行保护&#xff0c;防止用户误修改。本文将介绍如何使用EasyExcel 4.0.3实现锁定Excel表头和第二行…

dify docker知识库topk最大值参数配置

1 问题说明 dify构建RAG知识库过程中&#xff0c;通过会遇到一些默认配置不能解决的问题。 比如topk&#xff0c;topk默认最大10&#xff0c;对语义模糊的检索&#xff0c;目标文档可能没进前10&#xff0c;出现在10-30区间。 所以&#xff0c;需要调整topk最大值参数。 # T…

SRE命令行兵器谱之一:精通top/htop - 从性能“体检”到瓶颈“解剖”

SRE命令行兵器谱之一:精通top/htop - 从性能“体检”到瓶颈“解剖” SRE的“战场”:真实故障场景 下午三点,监控系统告警:“核心API服务响应时间(P99)飙升至5秒”。用户已经开始在群里抱怨接口超时。这是一个典型的线上性能问题,每一秒的延迟都在影响用户体验和公司收…

一、Git与Gitee常见问题解答

Git与Gitee常见问题解答 Git相关问题 Q1: 什么是Git&#xff1f; A: Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds开发。它能够跟踪文件的变更历史&#xff0c;支持多人协作开发&#xff0c;是现代软件开发中不可或缺的工具。 Q2: Git的三个区域是什么&a…

kubernetes服务质量之QoS类

一、QoS类 Kubernetes的QoS&#xff08;Quality of Service&#xff09;类别允许您指定可用于应用程序的可用资源数量&#xff0c;以便更好地控制应用程序的可用性。它还允许您限制特定应用程序的资源使用率&#xff0c;以帮助保护系统的稳定性和性能。 Kubernetes 创建 Pod 时…

Redis--Lua脚本以及在SpringBoot中的使用

前言、为什么要用 Lua&#xff1f;多步操作合并为一步&#xff0c;保证原子性。减少网络通信次数。下推逻辑到 Redis&#xff0c;提高性能。一、Redis 使用 Lua 脚本的两种方式方式一&#xff1a;使用 --eval 执行脚本文件这种方式 需要先写一个 Lua 文件。&#x1f4cc; 示例&…

基于 C 语言的网络单词查询系统设计与实现(客户端 + 服务器端)

一、项目概述本文将介绍一个基于 C 语言开发的网络单词查询系统&#xff0c;该系统包含客户端和服务器端两部分&#xff0c;支持用户注册、登录、单词查询及历史记录查询等功能。系统采用 TCP socket 实现网络通信&#xff0c;使用 SQLite 数据库存储用户信息、单词数据及查询记…

《JAVA EE企业级应用开发》第一课笔记

《JAVA EE企业级应用开发》第一课笔记 文章目录《JAVA EE企业级应用开发》第一课笔记课程主题&#xff1a;三层架构与SSM框架概述一、核心架构&#xff1a;三层架构 (MVC)1. 表现层 (Presentation Layer)2. 业务逻辑层 (Business Logic Layer)3. 数据持久层 (Data Persistence …

RT-DETR网络结构

1.前言 本章主要来介绍下RT-DETR的网络结构,参考的依旧是ultralytics实现的RT-DETR-L,代码如下: ultralytics/ultralytics: Ultralytics YOLO 🚀 首先谈谈我对RT-DETR的浅显认识,他不像是YOLOv8这种纯CNN实现的网络,也不像是Vit这种以Transformer实现的网络,他是前一…

Python 文件复制实战指南:从基础操作到高效自动化的最佳实践

Python 文件复制实战指南:从基础操作到高效自动化的最佳实践 1. 引言:文件复制为何是自动化的核心能力? 在日常开发与运维工作中,文件复制是一项基础却至关重要的操作。无论是备份日志、同步配置、部署代码,还是批量迁移数据,都离不开对文件的精准复制与路径管理。而 Py…

WebSocket的基本使用方法

一. 与HTTP对比WebSocket 是一种在单个 TCP 连接上实现全双工&#xff08;双向&#xff09;通信的网络协议&#xff0c;它解决了传统 HTTP 协议 “请求 - 响应” 模式的局限性&#xff0c;让客户端&#xff08;如浏览器&#xff09;和服务器能建立持久连接&#xff0c;实现实时…

架构选型:为何用对象存储替代HDFS构建现代数据湖

在过去十余年的大数据浪潮中&#xff0c;Hadoop及其核心组件HDFS&#xff08;Hadoop分布式文件系统&#xff09;无疑是整个技术生态的基石。它开创性地解决了海量数据的分布式存储难题&#xff0c;支撑了无数企业从数据中挖掘价值。然而&#xff0c;随着数据规模的指数级增长以…

智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径

一、WebIDEPLOY 技术支撑下的智能养花系统核心构成在 WebIDEPLOY 技术的框架下&#xff0c;智能养花装置形成了一套精准协同的闭环系统&#xff0c;其核心在于通过技术整合实现 “监测 - 决策 - 执行 - 远程交互” 的无缝衔接&#xff0c;让植物养护更贴合城市居民的生活节奏。…