Skip to content

Commit 8faa0b7

Browse files
authored
Merge pull request #1461 from vitejs/dev
d2m
2 parents 46d1f9f + 2e25b9f commit 8faa0b7

23 files changed

+744
-117
lines changed

.vitepress/config.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,6 @@ export default defineConfig({
286286
text: '性能',
287287
link: '/guide/performance'
288288
},
289-
{
290-
text: 'Rolldown',
291-
link: '/guide/rolldown'
292-
},
293289
{
294290
text: `Migration from v${viteMajorVersion - 1}`,
295291
link: '/guide/migration'

blog/announcing-vite8-beta.md

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
---
2+
title: 'Vite 8 Beta: The Rolldown-powered Vite'
3+
author:
4+
name: The Vite Team
5+
date: 2025-12-03
6+
sidebar: false
7+
head:
8+
- - meta
9+
- property: og:type
10+
content: website
11+
- - meta
12+
- property: og:title
13+
content: Announcing Vite 8 Beta
14+
- - meta
15+
- property: og:image
16+
content: https://vite.dev/og-image-announcing-vite8-beta.webp
17+
- - meta
18+
- property: og:url
19+
content: https://vite.dev/blog/announcing-vite8-beta
20+
- - meta
21+
- property: og:description
22+
content: Vite 8 Beta Release Announcement
23+
- - meta
24+
- name: twitter:card
25+
content: summary_large_image
26+
---
27+
28+
# Vite 8 Beta:由 Rolldown 驱动的 Vite {#vite-8-beta}
29+
30+
_2025年12月3日_
31+
32+
![Vite 8 Beta Announcement Cover Image](/og-image-announcing-vite8-beta.webp)
33+
34+
摘要:由 [Rolldown](https://rolldown.rs/) 驱动的 Vite 8 首个测试版现已发布。Vite 8 提供了显著更快的生产构建速度,并开启了未来的改进可能性。你可以通过将 `vite` 升级到 `8.0.0-beta.0` 版本并阅读[迁移指南](/guide/migration)来试用这个新版本。
35+
36+
---
37+
38+
我们很高兴发布 Vite 8 的首个测试版。这个版本统一了底层工具链,带来了更好的一致性行为,以及显著的构建性能提升。Vite 现在使用 [Rolldown](https://rolldown.rs/) 作为其打包器,取代了之前 esbuild 和 Rollup 的组合。
39+
40+
## 面向 Web 的全新打包器 {#a-new-bundler-for-the-web}
41+
42+
Vite 之前依赖两个打包器来满足开发和生产构建的不同需求:
43+
44+
1. 开发期间使用 esbuild 进行快速编译
45+
2. 生产构建使用 Rollup 进行打包、分块和优化
46+
47+
这种方法让 Vite 能够专注于开发者体验和协调,而无需重新发明解析和打包功能。然而,维护两个独立的打包流水线引入了不一致性:独立的转换流水线、不同的插件系统,以及越来越多的粘合代码来保持开发和生产之间打包行为的一致性。
48+
49+
为了解决这个问题,[VoidZero 团队](https://voidzero.dev) 构建了 **Rolldown**,这是一个下一代打包器,目标是在 Vite 中使用。它的设计特点包括:
50+
51+
- **性能**:Rolldown 使用 Rust 编写,以原生速度运行。它的性能水平与 esbuild 相匹配,并且比 Rollup [快 10-30 倍](https://github.com/rolldown/benchmarks)
52+
- **兼容性**:Rolldown 支持与 Rollup 和 Vite 相同的插件 API。大多数 Vite 插件在 Vite 8 中可以开箱即用。
53+
- **更多功能**:Rolldown 为 Vite 解锁了更多高级功能,包括完整打包模式、更灵活的分块控制、模块级持久缓存、模块联邦等。
54+
55+
## 统一工具链 {#unifying-the-toolchain}
56+
57+
Vite 打包器更换的影响超越了性能范畴。打包器利用解析器、解析器、转换器和压缩器。Rolldown 为此目的使用了由 VoidZero 团队主导的另一个项目 Oxc。
58+
59+
**这使得 Vite 成为由同一团队维护的端到端工具链的入口:构建工具(Vite)、打包器(Rolldown)和编译器(Oxc)。**
60+
61+
这种一致性确保了整个堆栈中的行为一致性,并且随着 JavaScript 的不断发展,使我们能够快速采用并与新的语言规范保持一致。这也解锁了以前仅凭 Vite 无法实现的广泛改进。例如,我们可以利用 Oxc 的语义分析在 Rolldown 中实现更好的 tree-shaking。
62+
63+
## Vite 如何迁移到 Rolldown {#how-vite-migrated-to-rolldown}
64+
65+
迁移到由 Rolldown 驱动的 Vite 是一项基础性变革。因此,我们的团队采取了深思熟虑的步骤来实施这一变革,同时不牺牲稳定性和生态系统兼容性。
66+
67+
首先,我们发布了独立的 `rolldown-vite` 包作为[技术预览版](https://voidzero.dev/posts/announcing-rolldown-vite)。这让我们能够在不影响 Vite 稳定版本的情况下与早期采用者合作。早期采用者从 Rolldown 的性能提升中受益,同时提供了宝贵的反馈。亮点包括:
68+
69+
- Linear 的生产构建时间从 46 秒减少到 6 秒
70+
- Mercedes-Benz.io 将构建时间减少了高达 38%
71+
- Beehiiv 将构建时间减少了 64%
72+
73+
接下来,我们建立了一套测试套件,用于验证关键的 Vite 插件与 `rolldown-vite` 的兼容性。这项 CI 任务帮助我们及早发现回归问题和兼容性问题,特别是对于 SvelteKit、react-router 和 Storybook 等框架和元框架。
74+
75+
最后,我们构建了一个兼容层,帮助开发者从 Rollup 和 esbuild 选项迁移到相应的 Rolldown 选项。
76+
77+
因此,每个人都能顺利迁移到 Vite 8。
78+
79+
## 迁移到 Vite 8 Beta {#migrating-to-vite-8-beta}
80+
81+
由于 Vite 8 涉及核心构建行为,我们专注于保持配置 API 和插件钩子不变。我们创建了[迁移指南](/guide/migration)来帮助您升级。
82+
83+
有两种可用的升级路径:
84+
85+
1. **直接升级**:更新 `package.json` 并运行常规的开发和构建命令。
86+
2. **渐进式迁移**:从 Vite 7 迁移到 `rolldown-vite` 包,然后再到 Vite 8。这样您可以识别出与 Rolldown 相关的不兼容性或问题,而不会对 Vite 造成其他更改。(推荐用于较大或复杂的项目)
87+
88+
> [!IMPORTANT]
89+
> 如果你依赖特定的 Rollup 或 esbuild 选项,你可能需要对 Vite 配置进行一些调整。请参考[迁移指南](/guide/migration)获取详细的说明和示例。
90+
> 与所有非稳定的主版本一样,升级后建议进行全面测试以确保一切按预期工作。请务必报告任何[问题](https://github.com/vitejs/rolldown-vite/issues)
91+
92+
如果你使用的框架或工具将 Vite 作为依赖项,例如 Astro、Nuxt 或 Vitest,你必须在 `package.json` 中覆盖 `vite` 依赖项,这根据你使用的包管理器略有不同:
93+
94+
:::code-group
95+
96+
```json [npm]
97+
{
98+
"overrides": {
99+
"vite": "8.0.0-beta.0"
100+
}
101+
}
102+
```
103+
104+
```json [Yarn]
105+
{
106+
"resolutions": {
107+
"vite": "8.0.0-beta.0"
108+
}
109+
}
110+
```
111+
112+
```json [pnpm]
113+
{
114+
"pnpm": {
115+
"overrides": {
116+
"vite": "8.0.0-beta.0"
117+
}
118+
}
119+
}
120+
```
121+
122+
```json [Bun]
123+
{
124+
"overrides": {
125+
"vite": "8.0.0-beta.0"
126+
}
127+
}
128+
```
129+
130+
:::
131+
132+
添加这些覆盖后,重新安装你的依赖项,然后像往常一样启动开发服务器或构建你的项目。
133+
134+
## Vite 8 的附加功能 {#additional-features-in-vite-8}
135+
136+
除了搭载 Rolldown 之外,Vite 8 还带来了以下功能:
137+
138+
- **内置 tsconfig `paths` 支持**:开发者可以通过将 [`resolve.tsconfigPaths`](/config/shared-options.md#resolve-tsconfigpaths) 设置为 `true` 来启用此功能。此功能会带来轻微的性能成本,默认情况下未启用。
139+
- **`emitDecoratorMetadata` 支持**:Vite 8 现在内置了对 TypeScript [`emitDecoratorMetadata` 选项](https://www.typescriptlang.org/tsconfig/#emitDecoratorMetadata)的自动支持。更多详情请参见[功能](/guide/features.md#emitdecoratormetadata)页面。
140+
141+
## 展望未来 {#looking-ahead}
142+
143+
速度一直是 Vite 的标志性特性。与 Rolldown 的集成,以及延伸至 Oxc,意味着 JavaScript 开发者可以从 Rust 的速度中获益。升级到 Vite 8 应该会仅仅因为使用 Rust 而带来性能提升。
144+
145+
我们也即将推出 Vite 的完整打包模式,这将大幅提高大型项目的开发服务器速度。初步结果显示,开发服务器启动速度快了 3 倍,完全重新加载快了 40%,网络请求减少了 10 倍。
146+
147+
另一个标志性的 Vite 特性是插件生态系统。我们希望 JavaScript 开发者能够继续使用他们熟悉的 JavaScript 语言来扩展和定制 Vite,同时从 Rust 的性能提升中受益。我们的团队正在与 VoidZero 团队合作,以加速这些基于 Rust 系统中的 JavaScript 插件使用。
148+
149+
目前正在试验的即将到来的优化包括:
150+
151+
- [**原始 AST 传输**](https://github.com/oxc-project/oxc/issues/2409)。允许 JavaScript 插件以最小的开销访问 Rust 生成的 AST。
152+
- [**原生 MagicString 转换**](https://rolldown.rs/in-depth/native-magic-string#native-magicstring)。简单的自定义转换,逻辑在 JavaScript 中但计算在 Rust 中进行。
153+
154+
## **联系我们** {#connect-with-us}
155+
156+
如果你已经尝试过 Vite 8 测试版,我们很希望听到你的反馈!请报告任何问题或分享你的使用体验:
157+
158+
- **Discord**:加入我们的[社区服务器](https://chat.vite.dev/)进行实时讨论
159+
- **GitHub**:在 [GitHub 讨论区](https://github.com/vitejs/vite/discussions)分享反馈
160+
- **问题报告**:在 [rolldown-vite 仓库](https://github.com/vitejs/rolldown-vite/issues)报告 bug 和回归问题
161+
- **成果分享**:在 [rolldown-vite-perf-wins 仓库](https://github.com/vitejs/rolldown-vite-perf-wins)分享你改善的构建时间
162+
163+
我们感谢所有的报告和复现案例。它们帮助我们朝着发布稳定版 8.0.0 的目标前进。

config/build-options.md

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
- **默认:** `'baseline-widely-available'`
99
- **相关内容:** [浏览器兼容性](/guide/build#browser-compatibility)
1010

11-
最终软件包的浏览器兼容性目标。默认值是 Vite 的一个特殊值 `'baseline-widely-available'`,该值针对的是包含在 20255 月 1 日广泛可用的 [Baseline](https://web-platform-dx.github.io/web-features/) 中的浏览器。具体来说,它是 `['chrome107', 'edge107', 'firefox104', 'safari16']`
11+
最终软件包的浏览器兼容性目标。默认值是 Vite 的一个特殊值 `'baseline-widely-available'`,该值针对的是包含在 20261 月 1 日广泛可用的 [Baseline](https://web-platform-dx.github.io/web-features/) 中的浏览器。具体来说,它是 `['chrome111', 'edge111', 'firefox114', 'safari16.4']`
1212

1313
另一个特殊值是 `'esnext'` —— 即假设有原生动态导入支持,并只执行最低限度的转译。
1414

15-
转换过程将会由 esbuild 执行,并且此值应该是一个合法的 [esbuild 目标选项](https://esbuild.github.io/api/#target)。自定义目标也可以是一个 ES 版本(例如:`es2015`)、一个浏览器版本(例如:`chrome58`)或是多个目标组成的一个数组。
15+
转换过程将会由 Oxc Transformer 执行,并且此值应该是一个合法的 [Oxc Transformer 目标选项](https://oxc.rs/docs/guide/usage/transformer/lowering#target)。自定义目标也可以是一个 ES 版本(例如:`es2015`)、一个浏览器版本(例如:`chrome58`)或是多个目标组成的一个数组。
1616

17-
注意:如果代码包含不能被 `esbuild` 安全地编译的特性,那么构建将会失败。查看 [esbuild 文档](https://esbuild.github.io/content-types/#javascript) 获取更多细节。
17+
注意:如果代码包含不能被 `Oxc` 安全地编译的特性,那么构建将会输出警告。查看 [Oxc 文档](https://oxc.rs/docs/guide/usage/transformer/lowering#warnings) 获取更多细节。
1818

1919
## build.modulePreload {#build-modulepreload}
2020

@@ -129,10 +129,16 @@ Git LFS 占位符会自动排除在内联之外,因为它们不包含其所表
129129

130130
## build.cssMinify {#build-cssminify}
131131

132-
- **类型:** `boolean | 'esbuild' | 'lightningcss'`
133-
- **默认:** 对于客户端,与 [`build.minify`](#build-minify) 相同;对于 SSR,为 `'esbuild'`
132+
- **类型:** `boolean | 'lightningcss' | 'esbuild'`
133+
- **默认:** 对于客户端,与 [`build.minify`](#build-minify) 相同;对于 SSR,为 `'lightningcss'`
134134

135-
此选项允许用户覆盖 CSS 最小化压缩的配置,而不是使用默认的 `build.minify`,这样你就可以单独配置 JS 和 CSS 的最小化压缩方式。Vite 默认使用 `esbuild` 来最小化 CSS。将此选项设置为 `'lightningcss'` 可以改用 [Lightning CSS](https://lightningcss.dev/minification.html) 进行压缩。设置为该项,便可以使用 [`css.lightningcss`](./shared-options.md#css-lightningcss) 选项来进行配置。
135+
此选项允许用户覆盖 CSS 最小化压缩的配置,而不是使用默认的 `build.minify`,这样你就可以单独配置 JS 和 CSS 的最小压缩方式。Vite 默认使用 [Lightning CSS](https://lightningcss.dev/minification.html) 来压缩 CSS。可以通过 [`css.lightningcss`](./shared-options.md#css-lightningcss) 进行配置。将此选项设置为 `'esbuild'` 可以改用 esbuild 进行压缩。
136+
137+
当设置为 `'esbuild'` 时,必须安装 esbuild。
138+
139+
```sh
140+
npm add -D esbuild
141+
```
136142

137143
## build.sourcemap {#build-sourcemap}
138144

@@ -141,17 +147,20 @@ Git LFS 占位符会自动排除在内联之外,因为它们不包含其所表
141147

142148
构建后是否生成 source map 文件。如果为 `true`,将会创建一个独立的 source map 文件。如果为 `'inline'`,source map 将作为一个 data URI 附加在输出文件中。`'hidden'` 的工作原理与 `true` 相似,只是 bundle 文件中相应的注释将不被保留。
143149

144-
## build.rollupOptions {#build-rollupoptions}
150+
## build.rolldownOptions {#build-rolldownoptions}
145151

146-
- **类型:** [`RollupOptions`](https://cn.rollupjs.org/configuration-options/)
152+
- **类型:** [`RolldownOptions`](https://rollupjs.org/configuration-options/)
147153

148-
自定义底层的 Rollup 打包配置。这与从 Rollup 配置文件导出的选项相同,并将与 Vite 的内部 Rollup 选项合并。查看 [Rollup 选项文档](https://cn.rollupjs.org/configuration-options/) 获取更多细节。
154+
<!-- TODO: update the link above and below to Rolldown's documentation -->
149155

150-
## build.commonjsOptions {#build-commonjsoptions}
156+
自定义底层的 Rolldown 打包配置。这与从 Rolldown 配置文件导出的选项相同,并将与 Vite 的内部 Rolldown 选项合并。查看 [Rolldown 选项文档](https://cn.rollupjs.org/configuration-options/) 获取更多细节。
151157

152-
- **类型:** [`RollupCommonJSOptions`](https://github.com/rollup/plugins/tree/master/packages/commonjs#options)
158+
## build.rollupOptions {#build-rollupoptions}
159+
160+
- **类型:** `RolldownOptions`
161+
- **已弃用**
153162

154-
传递给 [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/master/packages/commonjs) 插件的选项
163+
此选项是 `build.rolldownOptions` 选项的别名。请使用 `build.rolldownOptions` 选项代替
155164

156165
## build.dynamicImportVarsOptions {#build-dynamicimportvarsoptions}
157166

@@ -160,6 +169,8 @@ Git LFS 占位符会自动排除在内联之外,因为它们不包含其所表
160169

161170
传递给 [@rollup/plugin-dynamic-import-vars](https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars) 的选项。
162171

172+
<!-- TODO: we need to have a more detailed explanation here as we no longer use @rollup/plugin-dynamic-import-vars. we should say it's compatible with it though -->
173+
163174
## build.lib {#build-lib}
164175

165176
- **类型:** `{ entry: string | string[] | { [entryAlias: string]: string }, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string | ((format: ModuleFormat, entryName: string) => string), cssFileName?: string }`
@@ -256,16 +267,19 @@ export default defineConfig({
256267

257268
## build.minify {#build-minify}
258269

259-
- **类型:** `boolean | 'terser' | 'esbuild'`
260-
- **默认:** 客户端构建默认为`'esbuild'`,SSR构建默认为 `false`
270+
- **类型:** `boolean | 'oxc' | 'terser' | 'esbuild'`
271+
- **默认:** 客户端构建默认为`'oxc'`,SSR构建默认为 `false`
261272

262-
设置为 `false` 可以禁用最小化混淆,或是用来指定使用哪种混淆器。默认为 [Esbuild](https://github.com/evanw/esbuild),它比 terser 快 20-40 倍,压缩率只差 1%-2%。[Benchmarks](https://github.com/privatenumber/minification-benchmarks)
273+
设置为 `false` 可以禁用最小化混淆,或是用来指定使用哪种混淆器。默认使用 [Oxc Minifier](https://oxc.rs/docs/guide/usage/minifier),它比 terser 快 30~90 倍,但压缩率仅差 0.5~2%。[基准测试](https://github.com/privatenumber/minification-benchmarks)
274+
275+
`build.minify: 'esbuild'` 已弃用,将在未来版本中移除。
263276

264277
注意,在 lib 模式下使用 `'es'` 时,`build.minify` 选项不会缩减空格,因为会移除掉 pure 标注,导致破坏 tree-shaking。
265278

266-
当设置为 `'terser'` 时必须先安装 Terser。
279+
当设置为 `'esbuild'``'terser'` 时,必须分别安装 esbuild 或 Terser。
267280

268281
```sh
282+
npm add -D esbuild
269283
npm add -D terser
270284
```
271285

@@ -314,7 +328,9 @@ npm add -D terser
314328

315329
## build.watch {#build-watch}
316330

317-
- **类型:** [`WatcherOptions`](https://cn.rollupjs.org/configuration-options/#watch)`| null`
331+
<!-- TODO: update the link below to Rolldown's documentation -->
332+
333+
- **类型:** [`WatcherOptions`](https://rollupjs.org/configuration-options/#watch)`| null`
318334
- **默认:** `null`
319335

320336
设置为 `{}` 则会启用 rollup 的监听器。对于只在构建阶段或者集成流程使用的插件很常用。

config/dep-optimization-options.md

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,23 @@ export default defineConfig({
5151
})
5252
```
5353

54+
## optimizeDeps.rolldownOptions <NonInheritBadge /> {#optimizedeps-rolldownoptions}
55+
56+
- **类型:** [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys)`<``RolldownOptions`, `'input' | 'logLevel' | 'output'> & {
57+
output?: [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys)`<`
58+
`RolldownOutputOptions`,
59+
`'format' | 'sourcemap' | 'dir' | 'banner'>`
60+
`}`
61+
62+
<!-- TODO: add link to RolldownOptions -->
63+
<!-- TODO: add link to RolldownOutputOptions -->
64+
65+
在依赖扫描和优化过程中传递给 Rolldown 的选项。
66+
67+
某些选项进行了省略,因为修改它们与 Vite 的优化方案并不兼容。
68+
69+
- `plugins` 与 Vite 的 dep 插件合并
70+
5471
## optimizeDeps.esbuildOptions <NonInheritBadge /> {#optimizedeps-esbuildoptions}
5572

5673
- **类型:** [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys)`<`[`EsbuildBuildOptions`](https://esbuild.github.io/api/#general-options)`,
@@ -64,13 +81,9 @@ export default defineConfig({
6481
| 'outbase'
6582
| 'outExtension'
6683
| 'metafile'>`
84+
- **已弃用**
6785

68-
在依赖扫描和优化过程中传递给 esbuild 的选项。
69-
70-
某些选项进行了省略,因为修改它们与 Vite 的优化方案并不兼容。
71-
72-
- 忽略了 `external` 选项,请使用 Vite 的 `optimizeDeps.exclude` 选项
73-
- `plugins` 与 Vite 的 dep 插件合并
86+
此选项在内部被转换为 `optimizeDeps.rolldownOptions`。请使用 `optimizeDeps.rolldownOptions` 代替。
7487

7588
## optimizeDeps.force <NonInheritBadge /> {#optimizedeps-force}
7689

config/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ vite --config my-config.js
2323
```
2424

2525
::: tip 加载配置文件
26-
默认情况下,Vite 使用 `esbuild` 将配置文件打包到临时文件中并加载它。这可能会在 monorepo 中导入 TypeScript 文件时引发问题。如果你遇到了这种方法问题,可以通过指定 `--configLoader runner` 以改用 [module runner](/guide/api-environment-runtimes.html#modulerunner),它不会创建临时配置并将动态转换任何文件。请注意,module runner 不支持配置文件中的 CJS,但外部 CJS 包应该可以正常工作。
26+
默认情况下,Vite 使用 [Rolldown](https://rolldown.rs/) 将配置文件打包到临时文件中并加载它。这可能会在 monorepo 中导入 TypeScript 文件时引发问题。如果你遇到了这种方法问题,可以通过指定 `--configLoader runner` 以改用 [module runner](/guide/api-environment-runtimes.html#modulerunner),它不会创建临时配置并将动态转换任何文件。请注意,module runner 不支持配置文件中的 CJS,但外部 CJS 包应该可以正常工作。
2727

2828
另外,如果你正在使用支持TypeScript的环境(例如 `node --experimental-strip-types`),或者只编写纯 JavaScript 代码,你可以指定 `--configLoader native` 以使用环境的本机运行时加载配置文件。请注意,配置文件导入的模块的更新不会被检测到,因此不会自动重启 Vite 服务器。
2929
:::

0 commit comments

Comments
 (0)