第一次启动 Vite 项目时,控制台里那行 Pre-bundling dependencies 到底在做什么?这篇是我读完源码后的整理。
为什么需要预构建
浏览器原生 ESM 不支持 CommonJS,而 node_modules 里大量包还是 CJS。另外像 lodash-es 这样的包有几百个模块文件,浏览器会发出几百个请求。
Vite 用 esbuild 把每个依赖打包成单文件,顺便把 CJS 转成 ESM。
缓存放在哪
node_modules/.vite/deps,缓存 key 由 lockfile、config 和 NODE_ENV 计算得出。这几个东西不变就不会重新构建。
什么时候需要手动干预
- 依赖里有动态
require,esbuild 分析不出来:加optimizeDeps.include - 新增依赖后不想重启:
optimizeDeps.force或者删缓存重启 - 本地 link 的 monorepo 包:默认不预构建,需要显式写进
include
一点体会
预构建本质是一次「依赖不变、业务常变」的分层。想清楚哪些东西变化频率低,构建速度的问题就解决了一半。