Vite 8 Beta:Rolldown 驱动的新一代 Vite

Vite 8 Beta:Rolldown 驱动的新一代 Vite

由 Rolldown 驱动的 Vite 8 首个 Beta 版本已经发布。Vite 8 带来了显著更快的生产构建性能,并为后续能力升级解锁了更多可能。开发者可以通过将 vite 升级到 8.0.0-beta.0 并查阅官方迁移指南来体验这一版本。

Vite 团队表示,这次发布统一了底层工具链,使整体行为更一致,同时显著提升了构建性能。Vite 现在使用 Rolldown 作为打包器,替代了此前「开发使用 esbuild、生产使用 Rollup」的双打包器组合。

原文 Vite 8 Beta:Rolldown 驱动的新一代 Vite

一个面向 Web 的新打包器

在此之前,为满足开发与生产环境不同的需求,Vite 依赖两个打包器:

  • esbuild:用于开发阶段的快速编译;
  • Rollup:用于生产环境的打包、分块(chunking)和优化。

这种组合让 Vite 能够把精力集中在开发体验和整体编排上,而不是从零开始重造解析与打包能力。不过,维护两套独立的打包流水线也带来了不少不一致:

  • 各自独立的转换(transform)流水线;
  • 不同的插件系统;
  • 越来越多的「胶水代码」用于在开发与生产之间对齐行为。

为了解决这些问题,VoidZero 团队构建了下一代打包器 Rolldown,目标就是服务于 Vite。Rolldown 的设计重点包括:

  • 性能:Rolldown 使用 Rust 编写,以接近原生的速度运行。在性能上可以与 esbuild 匹敌,并且比 Rollup 快约 10–30 倍;
  • 兼容性:Rolldown 支持与 Rollup 和 Vite 相同的插件 API,多数 Vite 插件在 Vite 8 中即可直接工作;
  • 更多特性:Rolldown 为 Vite 解锁了更高级的功能,例如 Full Bundle Mode、更灵活的 chunk 拆分控制、模块级持久缓存、Module Federation 等。

统一的工具链

Vite 替换打包器的影响远不止性能提升。打包器背后依赖解析器(parser)、解析/解析器(resolver)、转换器(transformer)和压缩器(minifier)等多个组件。Rolldown 在这些方面使用了由 VoidZero 主导的另一个项目 Oxc

这使得 Vite 成为由同一团队维护的端到端工具链的入口:构建工具(Vite)、打包器(Rolldown)以及编译器(Oxc)。

这种对齐带来了更一致的行为,并使团队能够更快地跟进和适配不断演进的 JavaScript 语言规范。它也解锁了一系列此前仅靠 Vite 本身难以实现的优化。例如,可以利用 Oxc 的语义分析能力,在 Rolldown 中进行更出色的 tree-shaking。

Vite 如何迁移到 Rolldown

迁移到由 Rolldown 驱动的 Vite 是一次基础性的架构调整。为避免牺牲稳定性或破坏生态兼容性,Vite 团队采取了循序渐进的策略。

首先,一个独立的 rolldown-vite 包作为技术预览发布。这样团队可以在不影响稳定版 Vite 的前提下,与早期使用者一起打磨 Rolldown。早期使用者一方面享受 Rolldown 带来的性能收益,另一方面也为项目提供了关键反馈。部分亮点包括:

  • Linear 将生产构建时间从 46 秒缩短到 6 秒;
  • Mercedes-Benz.io 将构建时间最多缩短了 38%;
  • Beehiiv 将构建时间缩短了 64%。

接着,团队为 rolldown-vite 搭建了一套针对关键 Vite 插件的测试集成(test suite)。这一 CI 任务帮助及早发现回归与兼容性问题,尤其是针对 SvelteKit、react-router、Storybook 等框架与元框架。

最后,团队为从 Rollup 与 esbuild 迁移到 Rolldown 的配置选项构建了一层兼容层,帮助开发者平滑过渡。

借助这些步骤,Vite 8 对所有用户都提供了一条相对平滑的迁移路径。

迁移到 Vite 8 Beta

由于 Vite 8 触及构建行为的核心部分,团队在设计时尽量保持配置 API 和插件钩子不变。同时提供了一份官方迁移指南,帮助开发者顺利升级。

目前有两种可选的升级路径:

  • 直接升级:在 package.json 中更新 vite 版本,然后像往常一样执行开发与构建命令;
  • 渐进迁移:先从 Vite 7 迁移到 rolldown-vite 包,然后再升级到 Vite 8。这样可以将与 Rolldown 相关的不兼容或问题单独暴露出来,而不与 Vite 其它变更混在一起(对大型或复杂项目尤为推荐)。

重要提示

如果项目依赖了特定的 Rollup 或 esbuild 选项,可能需要对 Vite 配置做一些调整。具体映射关系请参考官方迁移指南中的说明与示例。与所有「非稳定的大版本」一致,升级后应进行充分的测试,确认所有行为符合预期,并在发现问题时及时反馈 issue。

若使用的框架或工具本身将 Vite 作为依赖(例如 Astro、Nuxt 或 Vitest),则需要在 package.json 中覆盖其内部使用的 vite 版本。不同包管理器的覆写方式略有差异,但以使用 npmoverrides 字段为例:

{
  "overrides": {
    "vite": "8.0.0-beta.0"
  }
}

添加这些 overrides 后,重新安装依赖,然后像往常一样启动开发服务器或执行构建命令即可。

Vite 8 的新增特性

除了集成 Rolldown 之外,Vite 8 还带来了一些值得关注的新特性:

  • 内置 tsconfig paths 支持
    开发者可以通过将 resolve.tsconfigPaths 设置为 true 来启用基于 tsconfig.json 的路径别名支持。该特性会带来少量性能开销,因此默认是关闭状态。

  • emitDecoratorMetadata 支持
    Vite 8 现在原生支持 TypeScript 的 emitDecoratorMetadata 选项。更详细的说明可以在官方文档的 Features 页面中查阅。

展望未来

速度一直是 Vite 的标志性特征。通过与 Rolldown 以及 Oxc 的集成,JavaScript 开发者可以直接享受 Rust 带来的性能优势。团队预计,仅仅升级到 Vite 8,本身就能够带来一定程度的性能收益。

Vite 团队也计划很快发布 Vite 的 Full Bundle Mode,这一模式有望大幅提升大型项目的开发服务器性能。初步测试结果显示:

  • 开发服务器启动速度提升约 3 倍;
  • 完整页面刷新(full reload)速度提升约 40%;
  • 网络请求数量减少约 10 倍。

插件生态同样是 Vite 的另一大标志。团队希望 JavaScript 开发者继续使用熟悉的 JavaScript 语言来扩展和定制 Vite,同时享受 Rust 带来的性能加成。为此,Vite 团队正与 VoidZero 团队协作,加速在这些基于 Rust 的系统中对 JavaScript 插件的支持与优化。

目前仍处于实验阶段的一些即将到来的优化包括:

  • Raw AST transfer(原始 AST 传递):允许 JavaScript 插件以极低的开销访问由 Rust 侧生成的 AST;
  • Native MagicString transforms(原生 MagicString 转换):保持自定义转换逻辑写在 JavaScript 里,但将具体计算过程下沉到 Rust 来执行。
posted @ 2025-12-04 08:12  JaguarJack  阅读(16)  评论(0)    收藏  举报