使用|使用 vite 重构现有 Webpack 项目
前言
前段时间的某一天晚上 1 点左右,我突然被小伙伴的电话叫醒,被告知线上有个问题帮忙看一下,然后排查了一下是有部分功能有问题,需要 回退部分功能,也就意味着要重新编译打新的镜像,然后我操作完之后重新打 tag
以触发 ci/cd
的部署流程,结果就是,等啊等啊等啊等,在 npm run build
之后大概等了 15 分钟左右,才执行完,这种速度显然是不可接受的,必须找时间解决一下老项目优的构建问题。
项目背景
- 技术栈:React + react-app-rewired(webpack4) + mobx + stylus...
- 项目特点:各个独立的系统功能模块众多,比较适合增量编译
webpack4
,已经落后与 web
生态的技术栈,所以也就没有优化的必要,直接升级或者换掉是正确的选择,在前端生态不停蜕变的道路上,拥抱变化 才是最明智的。一开始想尝试用
webpack5
的增量编译来解决现在编译慢的问题,编译慢还是编译的文件太多了,改动什么才编译什么,相当于复杂度从O(n) 降到 O(1),但增量编译如和做到在打 docker
镜像时还能正常使用的,docker
构建镜像时会根据 dockerfile
中的每条命令生成一个新的镜像,而在打 docker
镜像时,属于 无状态 行为,它怎么知道你的文件有改动呢,文件改动又属于 git
行为,就算能实现实现的复杂度和要踩的坑可能会更多,而且相关的文章比较少,最终还是放弃了 webpack5 选择了 vite。使用 vite 重构
- 使用 https://github.com/tnfe/wp2vite 进行
webpack
项目转换成 vite - 安装 https://github.com/thundernet... 插件默认将项目中的
stylus
文件以css module
来处理
- 在
vite
中只有将css
文件后缀加上xx.module.styl
才会将其处理为 css module
- 在
vite
中不支持stylus
内使用别名,改为相对路径- 将系统量变由
process.env...
改为import.meta.env...
- 将项目中有使用
require
语法引入js
包的改为import
- 将
webpack
动态引入import(’../’ + var)
重构vite
中import.meta.glob
语法实现
- 重构完后 mobx 的值无法正常的响应,将 mobx 升级 6+,重构部分语法,并
observer
声明根组件 - 运行在测试环境时点击到某些页面直接崩溃,控制台报
Uncaught TypeError: Failed to fetch dynamically imported module
这个问题在开发时没有出现,因为在报错信息上完全看不出来到底是哪里出现了问题,最后无奈采用了二分注释大法,每一次注释掉一部分代码都需要重新编译在运行,直到最后确认出一个名为ad-xxx.ts
的文件,改了名字比如bd-xxx.ts
或者cad-xxx.ts
都可以正常运行,我整个人当场懵逼,最后得知是因为我的浏览器安装了ad-block
插件,这个而这个 命名会触发插件的拦截规则 误认为是广告文件,从而在运行时加载该文件失败则会出现上述报错,把插件关掉就正常了,之前我也遇到过类似的问题是在网页的轮播图上,但这次排查了半天硬是没想到是插件的问题,哎,大意了,各类插件不讲武德,偷袭我这个不到 35 岁的年轻同志。
开发启动 | 构建生产包 | 热更新 | |
---|---|---|---|
重构前 | ~10秒钟 | ~9分钟 | 体验差劲(可能是跟之前配置有关) |
重构前 | ~1.5秒钟 | ~4分钟 | 体验丝滑 |
vite
真香,尤大牛批!推荐阅读
- 延迟队列
- 运维|Anolis龙蜥升级kernel
- vb|VB中利用CopyMemory使用指针
- Golang|Golang——指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针
- Vue加载中动画组件使用方法详解
- Vue使用Tinymce富文本自定义toolbar按钮的实践
- 使用Supervisor守护ASP.NET|使用Supervisor守护ASP.NET Core应用程序进程
- C语言常用宏定义(#define)使用方法
- C语言|vscode配置C语言环境
- 头歌Java|十一、方法的使用