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

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.

10-30x Nhanh hơn Rollup trong production build
46s → 6s Build time thực tế tại Linear
64% Giảm build time tại Beehiiv
0 config Migration cho dự án React/Vue/Svelte

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:

3x Dev server startup nhanh hơn
40% Full reload nhanh hơn
10x Ít network requests hơn

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
CSS bundling Experimental

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 Oxfmt
  • vite lib — Library bundling chuyên dụng
  • vite 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?

Nên upgrade ngay
Dự án mới bắt đầu, hoặc dự án hiện tại dùng Vite 6/7 với setup chuẩn (Vue, React, Svelte). Migration gần như zero-effort.
Upgrade sau khi test kỹ
Dự án có nhiều plugin custom hoặc dùng esbuild API trực tiếp. Chạy rolldown-vite song song để validate trước.
Chờ thêm
Dự án phụ thuộc vào meta-framework chưa support Vite 8 (kiểm tra compatibility matrix của Nuxt, Astro, SvelteKit).

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