最近想做点东西,于是翻出了 Github 上的陈年老项目,想着给依赖升个级,继续做点东西。主要升级的范围就是 Vite 从 5 升到 6,以及配套的各插件都统一升级。
一切就跟平常那样平常。
在开发环境,一切顺利,跟这个项目以前一样丝滑。但是,当我试着打包时,一串红色的 error 从终端的界面跃入我的眼帘:
于是我立马检查了 vite.config.js 发现跟以前的别无二致,但报错的地方,以前都是这么写的啊:
{
esbuild: {
pure: ['console', 'debugger']
}
}
难道是 Vite 更改了配置?于是,又把 Vite 文档读了一遍(三点了,饮茶先呐)。然而,没什么收获。
于是,我去了 Vite 的 issues,然后找到了对应问题的描述:
大体的意思就是说,这锅不该 Vite 背,应该 esbuild 背,因为在 0.24.1+ 中,debugger 已经不能从 esbuild.pure 字段中传入,要在 esbuild.drop 中传入。
于是,我就把配置改成了这样:
{
esbuild: {
pure: ['console'],
drop: ['debugger']
}
}
而后编译,一切正常。
然鹅,事情不能就这么结束了,我得知道 esbuild 为啥要这么改呢?
经过一段时间的思考,得出了以下结论:
-
pure 字段:设计初衷是标记那些“纯函数调用”——即没有副作用、返回值未被使用的函数调用(比如 console.log)。这类表达式如果被标记为纯函数,esbuild 就能安全地将它们移除,从而优化输出代码。
-
drop 字段:用于直接删除某些特定的语句,比如 debugger 语句。
所以,从本质上来说,这两个字段的存在对于代码优化来说,是会执行不同的方法的,为了让代码优化更精准和更安全,还是分开来配置会比较妥当。
我是 Allen,一个 HR 转码的大龄前端技术人,欢迎来聊。🫡