· oxc / oxlint / rolldown

Oxc 2026 — Đánh giá bộ toolchain JS viết bằng Rust

Oxlint sẵn sàng cho production, nhanh hơn ESLint 50–118 lần. Rolldown là bundler mặc định của Vite 8. Transformer ổn định; minifier alpha — chưa nên dùng.

Bởi

2.469 từ · 13 phút đọc

Thêm linter của Oxc — oxlint — vào bước lint của bạn ngay hôm nay. Nâng cấp lên Vite 8 và bạn có Rolldown theo. Tạm thời bỏ qua minifier. Đó là kết luận — phần còn lại của bài này trình bày các con số đằng sau nó.

Bài này dành cho ai

Kỹ sư frontend và full-stack đang chạy ESLint trên codebase lớn và cảm thấy chậm, hoặc đang dùng Vite 7 và cân nhắc nâng cấp. Nếu bạn đang dùng Next.js với Turbopack hoặc stack Webpack mà không có Vite, phần lớn nội dung này chưa áp dụng được.

Chúng tôi đã thử nghiệm gì

Oxlint v1.x (v1 GA: tháng 6/2025; beta: tháng 3/2025). Oxlint JS plugins alpha (tháng 3/2026). Rolldown tích hợp trong Vite 8.0.0 (12/3/2026). oxc-minify alpha (công bố tháng 3/2025). Dữ liệu benchmark lấy từ các repo chính thức của oxc-project (bench-linter, bench-transformer) và repo độc lập minification-benchmarks. Cấu hình máy trong benchmark: M2 Max (12 nhân) và M4 Max; GitHub Actions CI cho benchmark transformer.

Oxc là gì

Oxc (Oxidation Compiler) không phải là một công cụ đơn lẻ. Đây là tập hợp các thành phần lõi của toolchain JavaScript và TypeScript viết bằng Rust, được phát triển dưới dự án oxc-project. Các thành phần bao gồm:

  • Parser — tạo ra AST dùng chung
  • Oxlint — linter
  • Transformer — biên dịch TypeScript/JSX sang ES2015+
  • Rolldown — bundler
  • oxc-minify — minifier (alpha)
  • Resolver — phân giải module Node.js (chỉ dùng nội bộ)

Điểm cốt lõi về kiến trúc: mọi thành phần đều dùng chung parser và AST viết bằng Rust. Quá trình phân tích cú pháp chỉ xảy ra một lần cho mỗi file, bất kể có bao nhiêu công cụ chạy trên đó. Đó mới là nguồn gốc của các con số về tốc độ — không chỉ vì Rust nhanh, mà còn vì bạn không phải parse lại cho mỗi lần xử lý.

Oxlint — dùng ngay đi

Oxlint v1 đạt GA vào tháng 6/2025 với hơn 500 rule; bộ rule đã tăng lên đáng kể kể từ đó — tài liệu linter hiện tại liệt kê hơn 813 rule tích hợp sẵn (oxc.rs/docs/guide/usage/linter). Tại thời điểm beta (tháng 3/2025), nhóm phát triển chạy oxlint trên các repo open-source lớn và thu được các con số sau, cho thấy mức cải thiện của v1 beta so với bản GA đầu tiên (tháng 12/2023, 205 rule):

CodebaseFilesThời gian Oxlint betaGA đầu tiên (tháng 12/2023)Tốc độ
microsoft/vscode5.7030.792s1.697s2.14× (beta so với GA, cùng codebase)
elastic/kibana68.5913.11s6.02s1.94×
vuejs/core1.06389ms217ms2.44×

Đây là so sánh v1 beta với bản GA đầu tiên (tháng 12/2023). So sánh ấn tượng hơn là oxlint vs ESLint v9 trên các rule không cần type:

  • Codebase VS Code, M2 Max (12 nhân): nhanh hơn ESLint v9 62 lần
  • Cùng codebase, M4 Max: nhanh hơn 118 lần

Khả năng tăng tốc theo số nhân không phải marketing — đó là nhờ đa luồng của Rust. ESLint chạy đơn luồng theo mặc định.

Các rule cần type là điểm yếu hơn. So với typescript-eslint trên Vue Core (24 rule giống nhau), oxlint đạt ~8× nhanh hơn trên M2 Max. Cần lưu ý về phương pháp đo: cấu hình ESLint dùng allowDefaultProject với giới hạn file cao, và chính config đó đã cảnh báo điều này làm chậm quá trình lint. Hãy coi con số 8× là giới hạn dưới.

JS plugins alpha (tháng 3/2026). Điểm thiếu sót lịch sử duy nhất của oxlint — không thể chạy ESLint JS plugin qua nó — đã được lấp đầy vào tháng 3/2026. Oxlint giờ tải các ESLint JavaScript plugin hiện có qua một JS bridge, chạy song song với các rule Rust gốc. Bridge này làm chậm hơn so với chế độ native-only, nhưng kết quả vẫn nhanh hơn ESLint 4.8 lần:

  • Repo Node.js (6.298 file, 104 rule Rust + 75 rule JS plugin + 23 rule JS tùy chỉnh): 21 giây so với 1:43 của ESLint.

Điều này quan trọng với các dự án có nhiều ESLint plugin tùy chỉnh (accessibility, rule của tổ chức). Bạn không còn phải chọn giữa tốc độ của oxlint và hệ sinh thái plugin của mình nữa.

Lộ trình chuyển đổi. Cách được khuyến nghị là chạy oxlint song song với ESLint, không phải thay thế. Cài eslint-plugin-oxlint và nó tự động vô hiệu hóa các ESLint rule mà oxlint đã xử lý. Bạn có lượt lint nhanh của oxlint cho các rule nó đảm nhận (hơn 813 và đang tăng), ESLint xử lý phần còn lại. Thêm oxlint vào CI trước, xác nhận không có false positive, rồi dần bỏ ESLint rule khi oxlint phủ sóng nhiều hơn. Loại bỏ ESLint hoàn toàn chỉ hợp lý khi các plugin tùy chỉnh của dự án có thể chuyển sang JS plugins bridge.

npm install --save-dev oxlint eslint-plugin-oxlint

Sau đó trong ESLint config:

// eslint.config.js
import oxlint from 'eslint-plugin-oxlint';

export default [
  ...oxlint.buildFromOxlintConfigFile('.oxlintrc.json'),
];

Hướng dẫn chuyển đổi chính thức: oxc.rs/docs/guide/usage/linter/migrate-from-eslint

Nếu bạn đang cân nhắc Biome như một giải pháp all-in-one thay thế, xem Biome vs ESLint để so sánh trực tiếp.

Rolldown — có sẵn khi bạn dùng Vite 8

Rolldown ra mắt là bundler mặc định trong Vite 8.0.0 ngày 12/3/2026. Nâng cấp lên Vite 8 là có Rolldown ngay, không cần cấu hình thêm. Đang dùng Webpack? Hướng dẫn chuyển từ Webpack sang Vite trình bày đầy đủ quá trình chuyển đổi bao gồm cả tương thích plugin.

Những gì thay đổi bên dưới: Vite 7 dùng esbuild cho dev server và Rollup cho production build. Vite 8 thay cả hai bằng Rolldown. Một bundler, hai chế độ, cùng output.

Lợi ích ngay lập tức:

  • ESM/CJS interop không cần @rollup/plugin-commonjs — Rolldown xử lý nội địa, theo interop semantics của esbuild. (Lưu ý: tài liệu ghi là “largely” giống esbuild, không phải hoàn toàn 1:1.)
  • Oxc transformer tích hợp sẵn — TypeScript, JSX và cú pháp hiện đại biên dịch được mà không cần plugin thêm.
  • Pipeline thống nhất — dev và prod dùng cùng một engine Rolldown, giảm thiểu sự khác biệt giữa hai môi trường.

Những điểm còn thiếu. Một số tính năng regex ES2025 chưa được triển khai. Các lệnh require() bên ngoài không phải lúc nào cũng được tự động chuyển thành import trong ESM output. Legacy decorators và decorator metadata được hỗ trợ (rolldown.rs/guide/notable-features).

Rolldown độc lập (ngoài Vite): khả thi, và Rolldown v1.0 có API tương thích với Rollup. Nhưng khả năng tương thích plugin với toàn bộ hệ sinh thái Rollup vẫn đang được hoàn thiện. Hướng an toàn khi dùng độc lập: kiểm tra danh sách plugin của bạn trước khi cam kết.

Tình trạng hệ sinh thái:

  • Vite 8 — tích hợp đầy đủ, sẵn sàng cho production
  • Nuxt / SvelteKit — cả hai đều dùng Vite, bạn có Rolldown khi nâng cấp
  • Next.js / Turbopack — không tích hợp; Next.js xây dựng trên toolchain Rust riêng
  • Webpack 5 — không có tích hợp Oxc chính thức; loader từ cộng đồng vẫn còn thực nghiệm

Transformer — ổn định, nhưng hãy dùng qua Rolldown

Oxc transformer biên dịch TypeScript, JSX và cú pháp hiện đại sang ES2015+. Đây là thành phần mà Vite 8 và Rolldown dùng nội bộ — trong ngữ cảnh đó nó đã sẵn sàng cho production. Dùng độc lập trực tiếp là có thể nhưng vẫn ở giai đoạn early-adopter.

Tốc độ, từ benchmark chính thức trên GitHub Actions CI:

Loại transformSo với SWCSo với Babel
TypeScript/JSX (file thông thường)Nhanh hơn 3–5×Nhanh hơn 20–50×
Đỉnh (UserSettings.tsx + React Refresh)5.71×64.39×
Bộ nhớÍt hơn 20%Ít hơn 70%
Kích thước package2 MB (so với 37 MB của SWC)2 MB (so với ~170 package của Babel)

Isolated declarations (emit .d.ts):

FileSo với tsc
UserSettings.tsx (124 dòng)Nhanh hơn 44×
parser.ts (10.777 dòng)~Nhanh hơn 21×

Lưu ý quan trọng: isolated declarations chỉ thực hiện per-file annotation stripping. Bạn vẫn cần tsc để kiểm tra type đầy đủ. Transformer không thay thế TypeScript compiler cho các lỗi type.

Thực tế từ cộng đồng. Các con số benchmark transformer (3–5× so với SWC, 20–50× so với Babel) là từ phía nhà phát triển. Các thread HN và báo cáo chuyển đổi từ cộng đồng cho thấy mức cải thiện thực tế khoảng 30–40% so với SWC — thận trọng hơn nhiều so với benchmark đỉnh. Cả hai đều hợp lý: benchmark đo một hot path duy nhất; dự án thực có cold start, overhead từ plugin, và nhiều dạng file khác nhau. Hãy tính với 30–40%, xem 5× là trần. Để xem SWC và esbuild so sánh thế nào bên ngoài hệ sinh thái Oxc, đọc esbuild vs SWC 2026.

Nếu bạn đang dùng Vite 8, bạn đã có transformer. Nếu muốn dùng trực tiếp ngoài Vite:

npm install oxc-transform

Decorators được hỗ trợ: dùng { decorator: { legacy: true } } cho experimentalDecorators của TypeScript. Để emit decorator metadata, thêm emitDecoratorMetadata trong cùng key decorator: { decorator: { legacy: true, emitDecoratorMetadata: true } }. Xem oxc.rs/docs/guide/usage/transformer.

oxc-minify — chờ thêm

oxc-minify đang trong giai đoạn alpha. Benchmark trên typescript.js (10.95 MB) cho thấy nó vượt esbuild:

Công cụKích thước outputNén gzipThời gian
oxc-minify3.35 MB (−69%)860.67 kB (−54%)444ms
esbuild3.49 MB (−68%)915.55 kB (−51%)492ms
SWC3.32 MB (−70%)858.29 kB (−54%)2.179ms
Terser>10s (hết thời gian)

Dữ liệu benchmark trên lấy từ thông báo oxc-minify alpha chính thức. Repo minification-benchmarks độc lập (cập nhật tháng 4/2026) cho thấy oxc-minify liên tục xếp trong top hai hoặc ba trên tất cả các file được kiểm thử, với thời gian thực thi nhanh nhất trên hầu hết bundle — dù không phải lúc nào cũng tạo ra output nhỏ nhất so với các công cụ tập trung vào nén.

Quan trọng hơn: constant inlining và dead code elimination tích cực chưa được triển khai. Các tính năng này đã được lên kế hoạch, nhưng thiếu chúng thì output của oxc-minify lớn hơn Terser trên codebase production đa dạng. Đừng dùng nó để thay thế trực tiếp Terser trong pipeline production. Theo dõi quá trình phát triển alpha và đánh giá lại khi DCE được hoàn thiện.

Mức độ sẵn sàng cho production

Thành phầnTrạng tháiKhuyến nghị
Oxlint✅ Production (v1 GA tháng 6/2025)Dùng ngay. Dùng eslint-plugin-oxlint để chuyển đổi dần.
Transformer✅ Production (qua Rolldown/Vite 8)Dùng qua Vite 8. Dùng độc lập là early-adopter.
Rolldown✅ Production (qua Vite 8.0, tháng 3/2026)Nâng cấp Vite 7 → 8. Chú ý edge case về ESM interop.
oxc-minify⚠️ AlphaTheo dõi; chưa nên đưa lên production.
Parser✅ Ổn định (nội bộ)Không phải quyết định trực tiếp cần áp dụng.

Nên và không nên dùng ngay bây giờ

Dùng oxlint nếu quá trình chạy ESLint mất hơn 10 giây trên CI và bạn có repo lớn. Tốc độ nhờ song song hóa là có thật, bộ rule đủ rộng cho hầu hết các team (hơn 813 rule và đang tăng, cộng với JS plugins alpha cho phần còn lại), và lộ trình chuyển đổi qua eslint-plugin-oxlint cho phép hoàn tác nếu cần.

Nâng cấp lên Vite 8 nếu bạn đang dùng Vite 7 và chưa gặp sự cố đã biết. Bundler thống nhất của Rolldown giảm một loại lỗi dev/prod không khớp. Chi phí nâng cấp là một cuối tuần kiểm tra danh sách plugin so với các điểm còn thiếu đã biết (một số edge case về ESM interop, một số tính năng regex ES2025).

Đừng vội với minifier hay standalone transformer. Alpha chưa sẵn sàng cho workload production, và transformer tốt hơn nên dùng qua Rolldown thay vì cài riêng. Thêm build tooling mà chính dự án đánh dấu là alpha là điều có thể khiến bạn mất nửa ngày khi nó âm thầm hỏng sau một tháng.

Điều cần lưu ý

  • Các con số benchmark transformer và parser là từ phía nhà phát triển (các repo oxc-project). Benchmark độc lập từ cộng đồng ít hơn và thận trọng hơn. Coi các con số được công bố là giới hạn trên.
  • Mức tăng tốc 8× khi lint với type cần lưu ý về phương pháp đo. Chính cấu hình ESLint đã ghi chú rằng cài đặt allowDefaultProject được thiết lập theo cách làm chậm quá trình lint. Tốc độ thực tế cho các lượt lint cần type có thể thấp hơn.
  • ESM/CJS interop của Rolldown được ghi là “largely” giống esbuild, không phải hoàn toàn. Các pattern interop bất thường có thể gặp edge case.
  • oxc-minify thiếu constant inlining và DCE tích cực. Nó không phải thay thế trực tiếp cho Terser trên các bundle production phức tạp.
  • Dự án này phát triển nhanh. Kiểm tra version và changelog trước khi áp dụng các con số benchmark cụ thể.

Tài liệu tham khảo