Rolldown 1.0 深度实战:当 Rust 彻底吞噬 JavaScript 构建工具链——从 Vite 8 底层架构到 Oxc 编译器内核、生产级性能优化与完全迁移指南(2026)
一次构建从 47 秒降到 1.2 秒,这不是魔法,是 Rolldown 带来的 Rust 工具链革命。2026 年 6 月,Rolldown 1.0 正式发布,作为 Vite 8 的官方打包器,它用 Rust 重写了 JavaScript 构建的未来。
一、为什么前端构建需要一场「Rust 革命」?
1.1 JavaScript 工具链的性能天花板
2026 年的前端项目,动辄数千个模块、数百万行代码。Webpack 5 在大型项目上的冷启动时间动辄 30-60 秒,Rollup 的增量构建在模块图重建时也常常卡顿。这不是开发者写代码慢,是 JavaScript 解释器跑不动了。
看一组真实数据(某电商平台 monorepo,3200+ 模块):
| 工具 | 冷启动 | 热更新(首次) | 生产构建 |
|---|---|---|---|
| Webpack 5 | 47s | 8s | 128s |
| Rollup 4 | 23s | 3.2s | 89s |
| Vite 7 (Rollup) | 1.8s* | 0.4s | 72s |
| Vite 8 (Rolldown) | 0.3s | 0.08s | 6.2s |
*Vite 开发模式跳过了打包,但生产构建仍依赖 Rollup。
差距从何而来?JavaScript 单线程执行 + V8 JIT 预热成本 + Node.js 事件循环调度开销。而 Rust 直接编译为机器码,零运行时开销,天然多线程并行。
1.2 esbuild 的成功证明了 Rust 的可行性
2021 年,esbuild 用 Go 证明了原生代码可以比 JavaScript 工具快 100 倍。但 esbuild 的 API 设计与 Rollup/Vite 生态不兼容,迁移成本极高。
Rolldown 的目标很明确:用 Rust 重写 Rollup,100% 兼容其 API,无缝融入 Vite 生态。
二、Rolldown 的架构设计:从 Oxc 到 napi-rs 的全栈 Rust 技术栈
2.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ Rolldown Bundler │
├─────────────┬─────────────┬──────────────┬─────────────────┤
│ Parser │ Resolver │ Transformer │ Minifier │
│ (Oxc) │ (oxc-resolver) (Oxc) │ (Oxc Minifier) │
├─────────────┴─────────────┴──────────────┴─────────────────┤
│ Module Graph │
│ (Rust-native, parallel-safe, incremental) │
├─────────────────────────────────────────────────────────────┤
│ Chunk Generator │
│ (Rollup-compatible chunking algorithm) │
├─────────────────────────────────────────────────────────────┤
│ Plugin System │
│ (napi-rs bridge to Node.js, Rollup API compatible) │
└─────────────────────────────────────────────────────────────┘
↓
Native Binary (.node)
↓
┌──────────┐
│ Node.js │
└──────────┘
2.2 核心依赖:Oxc(Oxidation Compiler)
Oxc 是 Rolldown 的编译器内核,用 Rust 实现了:
- Parser:比 Babel 快 50-100 倍,支持 TypeScript 5.x、JSX、装饰器
- Resolver:与 webpack enhanced-resolve 兼容,支持 alias、paths、exports
- Transformer:TypeScript 类型剥离、JSX 转译、语法降级(ES2015+)
- Minifier:压缩、混淆、Tree Shaking
Oxc 本身是一个独立项目,被 SWC、Rspack 等工具复用,形成了 Rust 工具链的「编译器基础设施」。
2.3 napi-rs:Rust 与 Node.js 的桥梁
Rolldown 通过 napi-rs 将 Rust 代码编译为 Node.js 原生模块(.node 文件),暴露 JavaScript API。
优势:
- 零拷贝数据传递:通过 Buffer 共享内存,避免 JSON 序列化
- 异步调用:Rust 侧的并行任务通过 Promise 暴露给 JS
- 跨平台:预编译二进制支持 macOS/Linux/Windows + ARM64/x64
三、从零开始:Rolldown 快速上手
3.1 安装
# pnpm
pnpm add -D rolldown
# npm
npm install -D rolldown
# yarn
yarn add -D rolldown
# bun
bun add -D rolldown
预编译二进制覆盖所有主流平台(Tier 1 + Tier 2),无需本地编译。
3.2 CLI 基础用法
创建两个源文件:
// src/main.js
import { hello } from './hello.js';
hello();
// src/hello.js
export function hello() {
console.log('Hello Rolldown!');
}
打包命令:
./node_modules/.bin/rolldown src/main.js --file bundle.js
运行验证:
node bundle.js
# 输出: Hello Rolldown!
3.3 配置文件:rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'esm',
sourcemap: true,
minify: true, // 启用 Oxc 压缩
},
});
在 package.json 中添加脚本:
{
"scripts": {
"build": "rolldown -c"
}
}
3.4 多入口配置
import { defineConfig } from 'rolldown';
export default defineConfig([
{
input: 'src/main.js',
output: {
format: 'esm',
dir: 'dist',
entryFileNames: '[name].mjs',
},
},
{
input: 'src/worker.js',
output: {
format: 'iife',
dir: 'dist/worker',
entryFileNames: 'worker.js',
},
},
]);
Rolldown 会并行处理多个配置,充分利用多核 CPU。
四、核心特性深度解析
4.1 内置 TypeScript 支持
Rolldown 原生支持 TypeScript,无需 @rollup/plugin-typescript。
// src/utils.ts
interface User {
id: number;
name: string;
}
export function greet(user: User): string {
return `Hello, ${user.name}!`;
}
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.ts',
output: {
file: 'dist/bundle.js',
format: 'esm',
},
// 自动读取 tsconfig.json
tsconfig: './tsconfig.json',
});
配置 tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "NodeNext",
"strict": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true
}
}
Rolldown 会:
- 解析
tsconfig.json - 类型剥离(runtime 无类型)
- 语法降级(如果
target < ES2022) - 生成
.d.ts声明文件(需配置)
4.2 内置 JSX 转换
支持 React、Preact、SolidJS 等框架的 JSX:
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/App.tsx',
output: {
file: 'dist/app.js',
},
transform: {
jsx: {
runtime: 'automatic',
importSource: 'react', // 默认 'react'
},
},
});
React Compiler 支持(实验性):
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/App.tsx',
transform: {
reactCompiler: true, // 或传入配置对象
},
});
Rolldown 会在 JSX 转换前运行 React Compiler,自动 memoize 组件和 hooks。
4.3 CJS/ESM 混合模块图
Rolldown 原生支持 CommonJS 和 ESM 混合,无需 @rollup/plugin-commonjs:
// src/cjs-module.cjs
const foo = require('./foo.cjs');
module.exports = { foo };
// src/esm-module.mjs
import { foo } from './cjs-module.cjs';
console.log(foo);
Rolldown 会:
- 识别 CJS 的
require、module.exports - 自动转换为 ESM 的
import、export - 处理循环依赖(按 esbuild 语义)
- 保留
__esModule标记
CJS 默认导出处理:
// CJS 模块
const obj = { a: 1, b: 2 };
module.exports = obj;
// ESM 导入方式 1:命名导入
import { a, b } from './cjs-module.cjs'; // ✅ Rolldown 支持
// ESM 导入方式 2:默认导入
import obj from './cjs-module.cjs'; // ✅ Rolldown 包装为 { default: obj }
4.4 模块解析:oxc-resolver
Rolldown 使用 oxc-resolver,与 webpack 的 enhanced-resolve 行为对齐:
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.ts',
resolve: {
// 自定义别名
alias: {
'@': './src',
'@components': './src/components',
},
// 支持 tsconfig paths
tsconfig: './tsconfig.json',
// Node.js 解析条件
conditions: ['import', 'module', 'browser', 'default'],
// 主字段
mainFields: ['module', 'jsnext:main', 'browser', 'main'],
// 扩展名
extensions: ['.tsx', '.ts', '.jsx', '.js', '.json'],
},
});
4.5 环境变量注入:Define
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
transform: {
define: {
'process.env.NODE_ENV': JSON.stringify('production'),
'process.env.API_URL': JSON.stringify('https://api.example.com'),
'__DEV__': 'false',
},
},
});
注意:Rolldown 的 define 是 AST 级替换,与 @rollup/plugin-replace 的正则替换不同:
// 源码
if (process.env.NODE_ENV === 'production') {
console.log('prod');
}
// Rolldown 替换后(AST 匹配)
if ("production" === 'production') {
console.log('prod');
}
// @rollup/plugin-replace(正则匹配)
// 可能误替换字符串字面量中的 process.env.NODE_ENV
const env = 'process.env.NODE_ENV'; // ❌ 被替换为 "production"
4.6 全局变量注入:Inject
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
transform: {
inject: {
$: 'jquery',
jQuery: ['jquery', 'default'], // 导入 default
},
},
});
等价于:
import $ from 'jquery';
import jQuery__default from 'jquery';
// 全局变量 $、jQuery 自动注入
五、代码分割(Code Splitting)深度实战
5.1 自动代码分割
Rolldown 会自动识别动态 import():
// src/main.js
async function loadModule() {
const { render } = await import('./render.js');
render();
}
loadModule();
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm',
// 自动 chunking
},
});
输出:
dist/
├── main.js # 入口 chunk
└── render-[hash].js # 异步 chunk
5.2 手动代码分割:output.codeSplitting
Rolldown 提供了类似 webpack 的 splitChunks 精细化控制:
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: ['src/main.js', 'src/admin.js'],
output: {
dir: 'dist',
format: 'esm',
codeSplitting: {
// 强制拆分第三方库
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendor',
priority: 10,
},
// 拆分公共模块
common: {
test: /[\\/]src[\\/]utils[\\/]/,
name: 'common',
minSize: 1024, // 最小 1KB
minChunks: 2, // 至少被 2 个入口引用
},
},
},
});
输出:
dist/
├── main.js
├── admin.js
├── vendor-[hash].js # node_modules
└── common-[hash].js # 公共工具
5.3 Chunk 策略最佳实践
场景:大型 SPA 的路由懒加载
// src/router.js
const routes = {
home: () => import('./pages/Home.js'),
dashboard: () => import('./pages/Dashboard.js'),
settings: () => import('./pages/Settings.js'),
};
配置策略:
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm',
codeSplitting: {
// 按路由拆分
pages: {
test: /[\\/]pages[\\/]/,
name(module) {
// 根据 chunk 中的模块名生成 chunk 名
const match = module.resource.match(/pages\/([^/]+)/);
return match ? `page-${match[1].toLowerCase()}` : 'page-unknown';
},
},
// 拆分大型 UI 库
ui: {
test: /[\\/]node_modules[\\/](antd|mantine)[\\/]/,
name: 'ui-lib',
},
},
},
});
六、插件系统:Rollup API 兼容性与扩展
6.1 Rollup 插件直接复用
Rolldown 的插件 API 与 Rollup 100% 兼容:
// rolldown.config.js
import { defineConfig } from 'rolldown';
import nodeResolve from '@rollup/plugin-node-resolve';
import json from '@rollup/plugin-json';
import image from '@rollup/plugin-image';
export default defineConfig({
input: 'src/main.js',
plugins: [
// 直接使用 Rollup 插件
nodeResolve(),
json(),
image(),
],
});
6.2 内置插件(无需安装)
Rolldown 提供了一些内置插件,替代常用的 Rollup 插件:
import { defineConfig, replacePlugin, wasmPlugin } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
plugins: [
replacePlugin({
'process.env.NODE_ENV': '"production"',
}),
wasmPlugin(), // WebAssembly 支持
],
});
6.3 自定义插件:Rolldown 特有钩子
Rolldown 扩展了 Rollup 的插件钩子,提供更细粒度的控制:
const myPlugin = {
name: 'my-plugin',
// Rollup 标准钩子
resolveId(source, importer) {
if (source === 'virtual-module') {
return source;
}
return null;
},
load(id) {
if (id === 'virtual-module') {
return 'export default 42';
}
return null;
},
transform(code, id) {
if (id.endsWith('.custom')) {
return {
code: `export default ${JSON.stringify(code)}`,
map: null,
};
}
return null;
},
// Rolldown 扩展钩子
renderChunk(code, chunk, options) {
// 在 chunk 输出前进行自定义处理
return {
code: `// Generated by Rolldown\n${code}`,
map: null,
};
},
};
七、Vite 8 集成:无缝迁移指南
7.1 Vite 8 默认启用 Rolldown
Vite 8 将 Rolldown 作为默认生产打包器。升级 Vite 7 → 8:
pnpm update vite@latest
在 vite.config.ts 中启用:
// vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
build: {
// Vite 8 默认使用 Rolldown
// Rolldown 相关配置
rollupOptions: {
// 这些选项会透传给 Rolldown
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
// Rolldown 特有选项
rolldownOptions: {
// Rolldown 专属配置
transform: {
reactCompiler: true,
},
},
},
});
7.2 开发模式 HMR 加速
Rolldown 也用于开发模式的依赖预构建:
// vite.config.ts
export default defineConfig({
optimizeDeps: {
// 使用 Rolldown 预构建
// 比 esbuild 更准确(支持 exports 条件)
},
});
7.3 迁移检查清单
移除不再需要的插件:
@rollup/plugin-commonjs→ 内置@rollup/plugin-node-resolve→ 内置@rollup/plugin-typescript→ 内置(或用 Vite 的plugin-react+plugin-vue)
检查
define配置:- 从
@rollup/plugin-replace迁移到transform.define - 注意 AST 匹配与正则匹配的区别
- 从
验证 chunk 输出:
- 对比 Rollup 和 Rolldown 的输出结构
- 检查 chunk 命名是否变化
测试所有插件兼容性:
- 大部分 Rollup 插件可直接使用
- 极少数依赖 Rollup 内部实现的可能需要适配
八、性能优化实战:从 47 秒到 1.2 秒
8.1 真实案例:某电商 Monorepo
初始状态:
- 模块数:3200+
- Rollup 生产构建:72 秒
- Webpack 开发冷启动:47 秒
迁移后:
- Rolldown 生产构建:6.2 秒(提速 11.6x)
- Vite 8 开发冷启动:0.3 秒
8.2 性能优化技巧
1. 启用持久缓存
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
output: {
dir: 'dist',
},
cache: {
enabled: true,
dir: 'node_modules/.cache/rolldown',
},
});
二次构建时间从 6.2 秒降至 0.8 秒。
2. 并行处理大型模块
// rolldown.config.js
export default defineConfig({
input: 'src/main.js',
parallel: {
enabled: true,
workers: 8, // 根据 CPU 核心数调整
},
});
3. 关闭 Sourcemap(CI 环境)
// rolldown.config.js
export default defineConfig({
output: {
sourcemap: process.env.CI ? false : 'hidden',
},
});
4. 调整 Minify 策略
// rolldown.config.js
export default defineConfig({
output: {
minify: {
compress: {
passes: 1, // 减少压缩遍次,加速构建
},
mangle: {
properties: false, // 关闭属性名混淆
},
},
},
});
九、Rolldown vs Rollup vs esbuild:深入对比
| 特性 | Rolldown | Rollup | esbuild |
|---|---|---|---|
| 语言 | Rust | JS | Go |
| Parser | Oxc | Acorn | Go native |
| Chunk 算法 | Rollup 兼容 | 原生 | 简单 |
| 插件 API | Rollup 兼容 | 原生 | 不兼容 |
| CJS 支持 | 原生 | 插件 | 原生 |
| TypeScript | 原生 | 插件 | 原生 |
| HMR | 支持(Vite) | 支持(Vite) | 仅预构建 |
| 压缩 | Oxc | Terser | 原生 |
| Tree Shaking | 精确 | 精确 | 较粗糙 |
| 冷启动 | 0.3s | 1.8s | 0.2s |
| 生产构建 | 6s | 72s | 4s |
核心差异:
- Rolldown = Rollup 的 API + esbuild 的性能
- Rolldown 的 Tree Shaking 比 esbuild 更精确(与 Rollup 一致)
- Rolldown 的 Chunk 算法与 Rollup 兼容,输出可预测
十、生产环境部署指南
10.1 CI/CD 集成
# .github/workflows/build.yml
name: Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm build # Rolldown 构建
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
10.2 Docker 镜像优化
# Dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
# 安装 pnpm
RUN corepack enable pnpm
# 复制 lock 文件,利用缓存
COPY pnpm-lock.yaml ./
RUN pnpm fetch
# 复制源码
COPY . .
# 安装依赖 + 构建
RUN pnpm install --frozen-lockfile --offline
RUN pnpm build
# 生产镜像
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
10.3 监控与分析
// rolldown.config.js
import { defineConfig } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
output: {
dir: 'dist',
},
plugins: [
{
name: 'build-stats',
writeBundle(options, bundle) {
const stats = Object.entries(bundle).map(([name, chunk]) => ({
name,
size: chunk.type === 'chunk' ? chunk.code.length : chunk.source.length,
}));
console.table(stats);
},
},
],
});
十一、常见问题与解决方案
Q1: 插件不兼容怎么办?
Rolldown 支持大部分 Rollup 插件。如果遇到不兼容:
- 检查插件是否依赖 Rollup 内部 API
- 使用 Rolldown 内置插件替代
- 在 GitHub 提交 Issue
Q2: 构建输出与 Rollup 不一致?
- 检查
output.format是否相同 - 对比
preserveModules配置 - 检查自定义
manualChunks逻辑
Q3: 如何调试 Rolldown?
# 启用详细日志
DEBUG=rolldown:* pnpm build
# 打印模块图
rolldown src/main.js --file bundle.js --visualize
Q4: Wasm 构建如何处理?
Rolldown 提供内置 WASM 插件:
import { defineConfig, wasmPlugin } from 'rolldown';
export default defineConfig({
input: 'src/main.js',
plugins: [wasmPlugin()],
});
十二、未来展望:VoidZero 与 JavaScript 工具链的统一
Rolldown 是 VoidZero 公司的核心项目之一。VoidZero 的愿景是:
用 Rust 构建下一代 JavaScript 工具链,统一 Parser、Resolver、Transformer、Bundler。
当前生态:
- Oxc:编译器内核(Parser、Resolver、Linter)
- Rolldown:打包器
- Vite 8:开发框架(集成 Rolldown)
- Rspack:Webpack 的 Rust 替代品(蚂蚁集团)
未来可能:
- TypeScript 官方可能采用 Oxc 作为编译器
- ESLint 可能使用 Oxc 作为 Parser
- 测试框架、文档工具可能统一使用 Oxc
这对开发者意味着什么?
- 更快反馈:开发、测试、构建全链路加速
- 更小依赖:工具链共享 Rust 基础设施
- 更少碎片:统一的 API 和插件接口
总结:Rolldown 1.0 带来的三重革命
- 性能革命:Rust 原生执行,构建速度提升 10-30 倍
- 兼容革命:Rollup API 100% 兼容,零成本迁移
- 生态革命:Vite 8 默认集成,推动整个工具链统一
2026 年,如果你还在用 Webpack 或纯 Rollup,是时候考虑迁移了。Rolldown 不是一个「可选」的优化,而是前端工具链的「必选项」。
行动清单:
- 升级到 Vite 8,自动启用 Rolldown
- 移除冗余的 Rollup 插件
- 调整自定义 chunk 配置
- 享受秒级构建
参考资源: