5月27日 00:59
Vite 为什么启动这么快?
Vite 之所以快,核心就两点:开发阶段不打包 + 按需编译。
传统打包工具(Webpack 等)在启动时会把整个应用打包一次,项目越大越慢。Vite 反过来,利用浏览器原生支持的 ES Module,让浏览器按需请求模块——只有被用到的文件才会被编译。加上 Vite 用 esbuild(Go 写的)做依赖预构建,速度比 JS 打包器快几十倍。
HMR 方面也是模块级别的:改了哪个文件,只重新编译那个文件和依赖它的链,不是整体刷新。
一句话:传统打包工具是把整个项目"煮好"再上菜,Vite 是你点什么它现做——启动当然快。
追问
Vite 生产环境还是用 Rollup 打包的,那开发快有什么用?
开发体验直接影响效率。你一天可能启动几十次 dev server、改几百次代码,每次快几秒加起来就是大量时间。生产打包只在 CI 里跑一次,慢点无所谓。而且 Vite 生产构建用的是 Rollup,本身也比 Webpack 快。
esbuild 这么快,为什么生产环境不用它打包?
esbuild 快是因为它功能少——不支持 AST 操作、不支持插件生态里那些复杂转换。Vite 用 esbuild 做依赖预构建(只需要转译),用 Rollup 做生产打包(需要 Tree-Shaking、代码分割、插件等),各取所长。
实际项目从 Webpack 迁移到 Vite 遇到过什么坑?
- CommonJS 依赖可能不兼容,需要配置
optimizeDeps.include require.context这种 Webpack 特有的 API 不能用了- CSS Modules 的导入方式有差异(
.module.css后缀强制要求) - 环境变量从
process.env.X变成import.meta.env.X
为什么 Vite 不用 webpack 的 bundleless 方案(如 Snowpack)?
Snowpack 已经停止维护了。Vite 和 Snowpack 思路类似,但 Vite 胜在:依赖预构建(esbuild)、开箱即用的 HMR、更完善的插件体系(兼容 Rollup 插件)。生态和社区活跃度完全不在一个量级。