记打包工具从 roadhog 迁移至 webpack
记录对公司项目的构建工具的改造,也可以说是升级。
项目背景
该项目是一个 React 的 PC 端 toB 后台项目。
项目由 5 年前的 antd-pro 搭建,主要使用了 React 16 + Antd 3 + roadhog2 (现 Umi 前身)。
为什么要做迁移
1.线上/本地构建速度慢
构建机器性能
- build: 450s
本地
- build: 300s+
- dev 启动: 60.76s
- dev 二次启动:同上
- HMR: 53s
2.本地内存占用高
- 本地 build: 3.1G+
- 本地 dev: 1.8-2G+
3.roadhog 早已不维护,最后一次更新是2018年,后续维护和改动困难
目标是什么
1.尽可能不改动业务代码,不影响业务
2.构建性能提升
怎么做
1.改造技术选型:webpack5
为什么是 webpack5?
- 和其他构建工具相比:rollup 主要用于库的打包;vite 的开发模式和线上模式使用的构建方案不同,容易产生不一致
- webpack 是个比较成熟的方案,社区的踩坑和问题解决都比较丰富,webpack5内置了很多优化,配置要比之前简单
- roadhog 其实是基于 webpack 的封装,因此迁移到webpack5,也可以说是 webpack 版本升级,改动成本相比其他工具较小
2.观察原构建输出结构,与改造后对比
3.webpack 配置
实际改造中,体感上 webpack5 比之前的版本相比,优点在于:
- 许多配置内置了,无需关注
- 各种报错会比较友好,甚至会提供建议
- 根据 mode 选项不同的自带优化
以下贴出本人改造后的基础配置:
1 | module.exports = { |
在此基础上,根据 dev 和 prod 两种模式,对配置进行拆分,拆分为 webpack.config.dev.js 和 webpack.config.prod.js,然后在 package.json 中配置不同的 script 命令,如:
1 | { |
4.验证
- 开启 dev 脚本,检查页面运行和报错情况
- 比对新旧 dist 产物是否缺失
- 部署测试,检查构建机器上是否正常运行与部署情况
- 测试环境验证
5.优化
以上步骤实现了我们的基本目标:迁移 webpack5,同时提升了构建的速度。目前还没有进行专门的优化,接下来看下是否能进一步优化构建速度。
webpack 官方文档中有一篇文章专门介绍来优化构建速度,链接。
按照文章中的指导,进行了一些尝试:
1.使用持久化缓存 cache ✅
1 | cache: { |
增加缓存的方式让 dev 二次启动的时间降低至 1.1s, 是原来的1/15。
2.DLL ❌
网上搜了下相关资料,webpack5 中 cache 方案已经是 DLL 的上位替代方案了, 参考。
实际上我加了 DLL 配置,构建时间大概提升 1s 左右
3.使用 esbuild-loader 编译js ❌
因为项目中使用了装饰器,但是esbuild 目前不支持 js 的装饰器,会打包失败
结果
构建机器性能提升 260%
打包时间降至 70s+, 提升 600%
- build: 73s ~ 80s
本地开发启动时间提升 375%
本地构建时间降至 30s, 提升 1000%
本地开发首次启动时间降至 16s, 提升 375%,二次启动时间降至 1.1s,提升 60000%
- build: 30s
- dev 首次启动: 16s
- dev 二次启动: 1.1s
- HMR: 0.5 - 1s+
- 内存占用: 500m+