Vite 8 + Rolldown: Bundler Rust Thống Nhất Thay Đổi Cuộc Chơi JavaScript
Posted on: 4/27/2026 8:13:19 AM
Table of contents
- Vấn đề của Vite trước phiên bản 8
- Rolldown là gì?
- Kiến trúc Vite 8: Bộ ba thống nhất
- Benchmark thực tế
- Tree-shaking: Chìa khóa tối ưu bundle size
- Tính năng mới trong Vite 8
- Hướng dẫn migrate từ Vite 7 lên Vite 8
- So sánh Rolldown với các bundler khác
- Vite+ — Tương lai phía trước
- Khi nào nên upgrade?
- Kết luận
Tháng 3 năm 2026, Vite 8.0 chính thức ra mắt với một thay đổi mang tính bước ngoặt: Rolldown — bundler viết bằng Rust — thay thế hoàn toàn bộ đôi esbuild + Rollup đã phục vụ Vite từ những ngày đầu. Đây không chỉ là một bản cập nhật thông thường, mà là sự thống nhất toàn bộ pipeline build thành một engine duy nhất, mở ra kỷ nguyên mới cho hiệu suất build JavaScript.
Vấn đề của Vite trước phiên bản 8
Từ khi ra đời, Vite sử dụng kiến trúc dual-bundler: esbuild cho development (dependency pre-bundling, TypeScript transpilation) và Rollup cho production build. Chiến lược này có lý do: esbuild cực nhanh cho dev nhưng tree-shaking yếu, trong khi Rollup tree-shaking mạnh nhưng chậm hơn nhiều.
graph LR
A[Source Code] --> B{Vite 7 trở về trước}
B -->|Development| C[esbuild
Go-based]
B -->|Production| D[Rollup
JavaScript-based]
C --> E[Dev Server]
D --> F[Production Bundle]
style A fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style B fill:#e94560,stroke:#fff,color:#fff
style C fill:#2c3e50,stroke:#fff,color:#fff
style D fill:#2c3e50,stroke:#fff,color:#fff
style E fill:#4CAF50,stroke:#fff,color:#fff
style F fill:#4CAF50,stroke:#fff,color:#fff
Kiến trúc dual-bundler của Vite trước phiên bản 8
Hệ quả của kiến trúc này:
- Inconsistency dev/prod: Hai engine xử lý code khác nhau dẫn đến bug chỉ xuất hiện khi build production, khó debug.
- Plugin fragmentation: Plugin Vite phải xử lý cả hai pipeline, tăng complexity cho plugin author.
- Maintenance burden: Vite core team phải maintain glue code đồng bộ giữa hai hệ thống hoàn toàn khác biệt.
- Production build chậm: Rollup viết bằng JavaScript, không thể cạnh tranh tốc độ với native code.
Rolldown là gì?
Rolldown là một JavaScript/TypeScript bundler viết bằng Rust, được phát triển bởi VoidZero (team đứng sau Vite, do Evan You dẫn dắt). Mục tiêu thiết kế:
- Tốc độ native của Rust, ngang esbuild hoặc nhanh hơn
- API tương thích hoàn toàn với Rollup — plugin ecosystem không bị phá vỡ
- Tree-shaking chất lượng cao theo thuật toán đã proven của Rollup
- Hỗ trợ ESM và CommonJS interop tự nhiên
Tại sao lại là Rust?
Rust cho phép zero-cost abstractions, memory safety không cần garbage collector, và true parallelism. Đây là lý do cả Rolldown, SWC, Oxc, Rspack đều chọn Rust thay vì Go (esbuild) hay JavaScript. Với dự án lớn (19.000+ modules), lợi thế parallel processing của Rust thể hiện rõ rệt: Rolldown nhanh hơn Rollup tới 25 lần.
Kiến trúc Vite 8: Bộ ba thống nhất
Vite 8 không chỉ đổi bundler — nó hợp nhất toàn bộ toolchain thành một bộ ba do cùng một team phát triển:
graph TB
V[Vite 8
Build Tool] --> R[Rolldown
Rust Bundler]
V --> O[Oxc
Rust Compiler/Parser]
R --> O
R --> F1[Dev Server]
R --> F2[Production Build]
R --> F3[Dependency Pre-bundling]
O --> P1[TypeScript Transform]
O --> P2[JSX Transform]
O --> P3[Minification]
style V fill:#e94560,stroke:#fff,color:#fff
style R fill:#2c3e50,stroke:#fff,color:#fff
style O fill:#2c3e50,stroke:#fff,color:#fff
style F1 fill:#4CAF50,stroke:#fff,color:#fff
style F2 fill:#4CAF50,stroke:#fff,color:#fff
style F3 fill:#4CAF50,stroke:#fff,color:#fff
style P1 fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style P2 fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style P3 fill:#f8f9fa,stroke:#e94560,color:#2c3e50
Kiến trúc thống nhất Vite 8 + Rolldown + Oxc
- Vite: Orchestrator — cấu hình, plugin system, dev server
- Rolldown: Bundler — module resolution, code splitting, tree-shaking, HMR
- Oxc: Compiler — parsing, TypeScript/JSX transform, minification, linting (thay thế esbuild transpiler + terser minifier)
Lợi ích chính: một pipeline duy nhất cho cả dev và prod. Code đi qua cùng một đường xử lý, loại bỏ hoàn toàn vấn đề inconsistency.
Benchmark thực tế
Dưới đây là kết quả benchmark từ các dự án production thực tế, không phải synthetic test:
| Dự án | Build cũ (Rollup) | Build mới (Rolldown) | Cải thiện |
|---|---|---|---|
| Linear (SaaS lớn) | 46 giây | 6 giây | 87% nhanh hơn |
| Ramp (Fintech) | ~60 giây | ~26 giây | 57% nhanh hơn |
| Mercedes-Benz.io | ~50 giây | ~31 giây | 38% nhanh hơn |
| Beehiiv (Media) | ~45 giây | ~16 giây | 64% nhanh hơn |
Benchmark theo quy mô module
| Số module | Rolldown | esbuild | Rollup |
|---|---|---|---|
| 100 | 0.18s | 0.09s | 0.41s |
| 1,000 | 0.52s | 0.31s | 3.8s |
| 19,000 | 1.61s | 1.44s | 40s+ |
Nhận xét
Với dự án nhỏ (< 500 modules), esbuild vẫn nhanh hơn nhẹ. Nhưng khi quy mô tăng lên 1,000+ modules, Rolldown gần bằng esbuild về tốc độ trong khi tree-shaking tốt hơn đáng kể. Trong test thực tế, Rolldown output 31KB so với 48KB của esbuild cho cùng một library — nhờ loại bỏ unused exports hiệu quả hơn.
Tree-shaking: Chìa khóa tối ưu bundle size
Rolldown kế thừa thuật toán tree-shaking đã được chứng minh từ Rollup, nhưng được tăng tốc bằng Rust. So với esbuild, Rolldown xử lý tốt hơn các trường hợp phức tạp:
- Re-export chains:
export { foo } from './bar'qua nhiều tầng — Rolldown trace và loại bỏ chính xác - Side-effect analysis: Phân tích sâu hơn xem module có side-effect hay không, loại bỏ an toàn hơn
- Semantic tree-shaking: Nhờ tích hợp Oxc, Rolldown hiểu được TypeScript type information để loại bỏ code chính xác hơn
Tính năng mới trong Vite 8
1. Built-in tsconfig paths support
// vite.config.ts
export default defineConfig({
resolve: {
tsconfigPaths: true // Tự động đọc paths từ tsconfig.json
}
})
Không cần plugin vite-tsconfig-paths nữa. Vite 8 đọc trực tiếp compilerOptions.paths từ tsconfig.
2. Decorator metadata support
Oxc hỗ trợ emitDecoratorMetadata tự động — quan trọng cho các framework sử dụng decorator như NestJS, Angular, hay TypeORM.
3. Full Bundle Mode (Experimental)
Chế độ thử nghiệm bundle toàn bộ dependency trong dev thay vì dùng native ESM unbundled:
Full Bundle Mode đặc biệt hữu ích cho dự án lớn với hàng nghìn module — nơi mà mô hình unbundled ESM của Vite gây ra quá nhiều HTTP requests khi cold start.
4. Plugin API ổn định
Rolldown giữ nguyên plugin API của Rollup. Hầu hết plugin Rollup và Vite hiện tại hoạt động không cần sửa đổi:
// Plugin Rollup hiện tại → hoạt động với Rolldown
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
// Các plugin Vite/Rollup hiện tại vẫn hoạt động
vue(),
legacy(),
pwa()
]
})
Hướng dẫn migrate từ Vite 7 lên Vite 8
Cách 1: Upgrade trực tiếp
# npm
npm install vite@latest
# pnpm
pnpm add vite@latest
# yarn
yarn add vite@latest
Với dự án React, Vue, hoặc Svelte chuẩn — chỉ cần upgrade version, không cần thay đổi config.
Cách 2: Migrate dần qua rolldown-vite
# Bước 1: Thử rolldown-vite (Vite fork dùng Rolldown)
npm install rolldown-vite
# Bước 2: Đổi import trong vite.config.ts
// import { defineConfig } from 'vite'
import { defineConfig } from 'rolldown-vite'
# Bước 3: Test kỹ → nếu OK, upgrade lên Vite 8 chính thức
Framework-specific overrides
Nếu bạn dùng meta-framework (Nuxt, Astro, SvelteKit), cần override Vite version:
// package.json — Nuxt
{
"overrides": {
"vite": "^8.0.0"
}
}
// package.json — nếu dùng pnpm
{
"pnpm": {
"overrides": {
"vite": "^8.0.0"
}
}
}
Lưu ý khi migrate
Một số plugin dùng API internal của esbuild hoặc Rollup-specific options có thể cần cập nhật. Kiểm tra changelog của từng plugin trước khi upgrade. Đặc biệt, các plugin sử dụng esbuild.transform() trực tiếp sẽ cần chuyển sang Oxc transform API.
So sánh Rolldown với các bundler khác
| Tiêu chí | Rolldown | esbuild | Rspack | Turbopack |
|---|---|---|---|---|
| Ngôn ngữ | Rust | Go | Rust | Rust |
| API tương thích | Rollup | Riêng | Webpack | Webpack (subset) |
| Tree-shaking | Xuất sắc | Cơ bản | Tốt | Tốt |
| Code splitting | Advanced (manual chunks) | Cơ bản | Webpack-level | Webpack-level |
| Tích hợp Vite | Native (default) | Legacy | Không | Không (Next.js only) |
| HMR | Built-in | Không | Có | Có |
| CSS bundling | Experimental | Có | Có | Có |
Vite+ — Tương lai phía trước
Cùng với Vite 8, VoidZero đang phát triển Vite+ — một superset của Vite tích hợp thêm:
vite test— Unit test với Vitest (built-in)vite lint— Linting với Oxlint (Rust-based, nhanh hơn ESLint 50-100x)vite fmt— Formatting với Oxfmtvite lib— Library bundling chuyên dụngvite run— Monorepo task runner
Tầm nhìn: một command duy nhất vite thay thế toàn bộ toolchain JavaScript hiện tại (Webpack + Babel + ESLint + Prettier + Jest).
graph TB
subgraph "Hiện tại — Fragmented"
W[Webpack/Vite] ~~~ B[Babel/SWC]
E[ESLint] ~~~ P[Prettier]
J[Jest/Vitest] ~~~ T[TypeScript]
end
subgraph "Tương lai — Vite+"
VP[vite build
Rolldown] ~~~ VT[vite test
Vitest]
VL[vite lint
Oxlint] ~~~ VF[vite fmt
Oxfmt]
end
style W fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style B fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style E fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style P fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style J fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style T fill:#f8f9fa,stroke:#e0e0e0,color:#2c3e50
style VP fill:#e94560,stroke:#fff,color:#fff
style VT fill:#e94560,stroke:#fff,color:#fff
style VL fill:#e94560,stroke:#fff,color:#fff
style VF fill:#e94560,stroke:#fff,color:#fff
Từ toolchain phân mảnh đến Vite+ thống nhất
Khi nào nên upgrade?
Kết luận
Vite 8 + Rolldown đánh dấu một bước tiến quan trọng trong hệ sinh thái JavaScript tooling. Bằng cách thống nhất dev và production build vào một engine Rust duy nhất, Vite giải quyết được vấn đề inconsistency dai dẳng, đồng thời tăng tốc production build 10-30 lần. Với Linear giảm build từ 46s xuống 6s, hay Beehiiv giảm 64%, đây không còn là promise trên giấy — mà là kết quả thực tế từ các dự án production.
Điều quan trọng nhất: migration gần như miễn phí cho hầu hết dự án. Nếu bạn đang dùng Vite, không có lý do gì để không thử Vite 8.
Tham khảo
Drizzle ORM — TypeScript ORM siêu nhẹ đang thay đổi cách viết SQL
NATS JetStream — Messaging siêu nhẹ cho Microservices Event-Driven
Disclaimer: The opinions expressed in this blog are solely my own and do not reflect the views or opinions of my employer or any affiliated organizations. The content provided is for informational and educational purposes only and should not be taken as professional advice. While I strive to provide accurate and up-to-date information, I make no warranties or guarantees about the completeness, reliability, or accuracy of the content. Readers are encouraged to verify the information and seek independent advice as needed. I disclaim any liability for decisions or actions taken based on the content of this blog.