Vite 7 升级笔记:build.target 默认值抬到 Chrome 107,Node 18 出局
官方发布说明:
Rolldown 集成文档:
Node.js 要求:20.19+ / 22.12+,Node 18 退场
Vite 7 要求 Node.js 20.19+ 或 22.12+,Node.js 18 被弃用(2025-04 EOL)。
选这两个版本线的原因和 require(esm) 有关:这些 Node.js 版本不需要 flag 就能支持 require(esm)。基于这一点,Vite 7.0 以纯 ESM 分发,同时 Vite 的 JS API 仍然可以被 CJS 模块 require。对使用者的影响是:构建机上如果还挂着 Node 18,升级 Vite 之前得先把 Node 换掉。
默认浏览器目标换成 baseline-widely-available
build.target 的默认值从 'modules' 改为 'baseline-widely-available'。
浏览器集合每个大版本更新一次,取的是匹配 Baseline Widely available 特性兼容的最低浏览器版本。新的最低版本大致是:
| 浏览器 | Vite 7 | 之前 |
|---|---|---|
| Chrome | 107 | 87 |
| Edge | 107 | — |
| Firefox | 104 | 78 |
| Safari | 16.0 | 14.0 |
直接后果是,一批特性可以不做转换就进生产包:原生 ES2022、顶层 await、私有类字段、逻辑赋值操作符等。产物因此更接近源码,体积和构建耗时都会受益。
代价是运行时下限被抬高。如果你的用户群里还有老版本 Safari 或 Chrome 需要覆盖,得显式把 build.target 调回去,或者用 @vitejs/plugin-legacy 之类的方案兜底——默认值不会替你考虑这部分。
Rolldown 集成:rolldown-vite
Rolldown 是基于 Rust 的下一代打包器,设计为 Rollup 的替代品,在保持生态兼容的前提下提升性能。
用 rolldown-vite 包替换默认的 vite 包即可,是 drop-in 替代。Rolldown 未来会成为 Vite 的默认打包器;切换后大型项目的构建时间缩短明显。
替换涉及的不只是一个打包器:
| 环节 | 原来 | 现在 |
|---|---|---|
| 构建 | Rollup | Rolldown |
| optimizer | esbuild | Rolldown |
| CommonJS 处理 | @rollup/plugin-commonjs | Rolldown |
| 语法降级 | esbuild | Oxc |
| CSS 压缩 | — | Lightning CSS(默认) |
| JS 压缩 | esbuild | Oxc minifier(默认) |
| 打包配置 | — | Rolldown |
Vite 内部的插件(alias、resolve 等)也转成了 Rust 实现,原生插件默认启用,默认值为 'v1'。
React 项目:plugin-react 与 Oxc
@vitejs/plugin-react v5.0.0+ 使用 Oxc 做 React 刷新转换。如果没有使用 Babel 插件(包括 React 编译器),整个转换都由 Oxc 完成,只需要更新 plugin-react 就能拿到提速。@vitejs/plugin-react-oxc 已弃用。
manualChunks 过时,改用 advancedChunks
manualChunks 已被标记为过时。Rolldown 通过 advancedChunks 提供更细粒度的分块控制,用法上类似 webpack 的 splitChunk。已有的 manualChunks 配置需要逐步迁移。
插件钩子过滤
插件可以指定模式,决定钩子在什么条件下被调用,以此减少 Rust 与 JS 运行时之间的通信开销。没有采用这一机制的插件,可以用 withFilter 包装器自行加上过滤条件。
新钩子 buildApp 与 this.meta
Vite 7 新增 buildApp 钩子,让插件能够协调多个环境的构建(Environment API for Frameworks)。
从 7.0.0 起,this.meta 在所有钩子中可用。
esbuild 变成可选 peer dependency
Vite 本身不再使用 esbuild,它退化为可选 peer dependency。
插件如果用到了 transformWithEsbuild,需要把 esbuild 加进插件自己的依赖,或者让用户手动安装——否则在干净环境下会直接报模块找不到。
从 Vite 6 升级
整体预期平滑。已被移除的废弃功能有两项:
- Sass legacy API 支持
splitVendorChunkPlugin
这两处如果还在用,需要先换掉再升级。
后续:Full Bundle Mode
未来会引入全量打包模式(Full Bundle Mode),在生产与开发环境都提供打包文件。初期是可选开启,稳定后设为默认。
对现阶段的迁移来说,值得先确认的是三件事:Node 版本是否达标、build.target 默认值抬升后浏览器覆盖范围是否可接受、以及切换 rolldown-vite 后 manualChunks 与 esbuild 相关的插件代码是否需要调整。