· biome / eslint / typescript
Biome vs ESLint 2026 — đã đến lúc chuyển đổi chưa?
Chuyển sang Biome nếu bắt đầu dự án TypeScript mới hoặc CI lint quá chậm. Ở lại ESLint nếu cần custom rules, security plugins hay Next.js/Vue/Svelte.
Bởi Ethan
1.567 từ · 8 phút đọc
Chuyển sang Biome nếu bạn đang bắt đầu một dự án TypeScript mới. Ở lại với ESLint nếu stack của bạn phụ thuộc vào custom rules, security plugins, hay framework-specific plugins. Nếu bạn đang ở giữa — monorepo cũ, plugin surface hạn chế — hướng kết hợp (Biome lo formatting + lint cơ bản, ESLint lo phần còn lại) đáng để bỏ ra một ngày thử nghiệm ngay bây giờ.
Bài này dành cho ai
Các developer TypeScript đang cân nhắc có nên thay ESLint (và Prettier) bằng Biome v2 hay không vào năm 2026. Nếu bạn đang làm Vue hay Svelte, hoặc team security bắt buộc dùng eslint-plugin-security, hãy đọc phần hạn chế của Biome trước.
Chúng tôi đã kiểm tra gì
Biome v2.4.15 (ra mắt 2026-05-09) so với ESLint 9.x + Prettier. Các benchmark được lấy từ bên thứ ba độc lập và số liệu do Biome tự công bố, với phương pháp đo được ghi chú rõ ràng cho từng trường hợp. Những con số do Biome tự báo cáo sẽ được đánh dấu — đây là giới hạn trên, không phải sự thật tuyệt đối.
Kết quả: Biome vs ESLint
Tốc độ — con số đáng tin
Biome nhanh hơn. Câu hỏi là nhanh hơn bao nhiêu, và liệu điều đó có thực sự ảnh hưởng đến workflow của bạn không.
| Kịch bản | ESLint + Prettier | Biome | Tốc độ tăng |
|---|---|---|---|
| Lint 10.000 files | 45.2 s | 0.8 s | 56× |
| Format 10.000 files | 12.1 s | 0.3 s | 40× |
| Lint dự án 500 files | 30+ s | 2–3 s | 10–20× |
| Pre-commit hook, monorepo TS lớn | 27.2 s | 1.8 s | 15× |
| Type-aware lint, backend 200 files | 15 s | 6 s | 2.5× |
Con số 56× là benchmark của chính Biome — hãy xem đây là giới hạn trên. Con số pre-commit (15×, giảm 92.6%) đến từ một monorepo TS thực tế trên production và có thể kiểm chứng được. BetterStack đo độc lập thấy 10–20× trên dự án 500 files.
Vì sao nhanh như vậy? Binary Rust đơn lẻ, tận dụng toàn bộ CPU song song (ESLint mặc định single-threaded), không có overhead khởi động Node.js, không có chuỗi plugin resolution.
Trên codebase 50k+ LOC, mỗi lần chạy CI có thể tiết kiệm 30–90 giây. Với vài trăm lần chạy mỗi tuần, đó là khoản ngân sách compute đáng kể.
Độ phủ rule — tốt, nhưng còn thiếu
Biome v2.4.15 có 502 rules và bao phủ khoảng 80–94% những gì các team thực tế dùng từ ESLint recommended + typescript-eslint cho các dự án TypeScript/React thông thường.
| Nhóm | Độ phủ của Biome |
|---|---|
| ESLint recommended cơ bản | ~94% các rule thường dùng |
| typescript-eslint type-aware | ~75–85% |
| React / JSX | ~90%+ |
| Accessibility (a11y) | Một phần — không có alt-text rules |
| Tổ chức import | Các trường hợp cơ bản đã có |
React hooks (useExhaustiveDependencies) | Có |
Security (eslint-plugin-security) | ❌ Chưa có |
| Framework plugins (Next.js, Vue, Svelte, Astro) | ❌ Chưa ổn định |
| Custom rules | ❌ GritQL plugin là v1, chưa sẵn sàng cho production |
Phần type-aware cần nói thêm. Biome v2.0 hỗ trợ type-aware linting mà không cần TypeScript compiler — công cụ đầu tiên làm được điều này. Độ phủ đạt khoảng 75–85% của typescript-eslint type-aware rules. Phần còn thiếu 15–25% là thật: nếu codebase bạn phụ thuộc vào deep inference cho floating-promise safety hay generics phức tạp, hãy kiểm thử trước khi chuyển.
Di chuyển — một ngày, không phải một sprint
Hai lệnh này giải quyết được phần lớn:
biome migrate eslint --write # đọc .eslintrc / eslint.config.js → biome.json
biome migrate prettier --write # đọc .prettierrc → biome.json
Công cụ xử lý được cả .eslintrc.* cũ lẫn eslint.config.js flat config, các plugin phổ biến (TypeScript ESLint, React, Unicorn, JSX A11y), và .eslintignore. Không xử lý được YAML config, cyclic references trong plugin config, hay custom rules.
Kitty Giraudel đã di chuyển một monorepo 200.000 dòng, 40 package trong khoảng một ngày. Nhận xét của cô: “nó nhẹ, nhanh và dễ bắt đầu đến mức tôi không thấy mình sẽ cài ESLint lại nữa.” Lưu ý: cô mất đi Cypress linting rules, và import rewriter của VS Code đôi khi làm hỏng các import graph phức tạp.
Các developer hiện đại hóa linting thường kết hợp với việc chuyển sang Vite — cả hai đều là nâng cấp tốc độ với Rust, phù hợp để gói gọn trong một sprint hiện đại hóa.
Tích hợp editor — dùng được, nhưng chưa chín
| Editor | Trạng thái |
|---|---|
| VS Code | Extension chính thức — format-on-save, diagnostics, code actions |
| JetBrains / WebStorm | Tích hợp sẵn từ WebStorm 2024.3+, không cần plugin |
| Neovim / Emacs | Qua LSP server của Biome |
Extension VS Code hoạt động được. Import organizer có lỗi đã biết với các import graph phức tạp — được đề cập trong hầu hết mọi bài viết di chuyển lớn từ 2024–2025. Nếu bạn dùng nhiều tính năng tự động tổ chức import trong VS Code, hãy kiểm thử kỹ trước khi cam kết chuyển đổi.
Extension VS Code của ESLint (20M+ lượt cài) đã được kiểm chứng trong nhiều năm và có documentation phong phú hơn trong hover popup. Khoảng cách này có thực và sẽ thu hẹp dần, nhưng chưa thu hẹp đủ.
BetterStack thấy output khớp hoàn toàn, ngoại trừ một vài edge case liên quan đến comment bên trong JSX attributes.
Sức khỏe hệ sinh thái — active, do tình nguyện viên dẫn dắt
Biome là một dự án active, không có nguy cơ bị bỏ rơi. Nhưng nó do tình nguyện viên điều hành:
- v2.4.15 ra mắt 2026-05-09; patch hàng tuần (~mỗi 7–10 ngày)
- 24.676 GitHub stars, 992 forks, ~16 core maintainers (tăng từ 10 người vào 2024)
- 15 triệu+ lượt tải mỗi tháng
- Được tài trợ bởi Vercel (đã tài trợ type-aware linting của v2.0) và Depot
- Không có VC backing; doanh thu từ Open Collective + GitHub Sponsors + Enterprise Support
Rủi ro duy nhất đáng chú ý: sự tập trung contributor. Một dự án với ~16 maintainers và không có chủ sở hữu doanh nghiệp có thể bị đình trệ nếu các contributor chủ chốt rời đi. Với 15M lượt tải và sự hỗ trợ từ Vercel, rủi ro này thấp hơn so với năm 2023, nhưng vẫn không bằng không. Nếu bạn đang đặt cược dài hạn 5 năm, hãy giữ tài liệu migration ESLint ở trạng thái cập nhật.
Kết luận
Chuyển sang Biome nếu:
- Bạn đang bắt đầu một dự án TypeScript hoặc React mới
- CI lint đang là điểm đau thực sự và plugin surface của bạn còn hạn chế
- Bạn dùng ESLint recommended + typescript-eslint + eslint-plugin-react — Biome bao phủ tốt mảng này ngay hôm nay
- Bạn đang chạy monorepo và muốn nested config mà không cần overhead
Ở lại với ESLint nếu:
- Team bạn có custom ESLint plugins
- Bạn phụ thuộc vào
eslint-plugin-security,eslint-plugin-next,eslint-plugin-vue, hayeslint-plugin-svelte - Cần full coverage type-aware của typescript-eslint
- Bạn cần độ sâu documentation của extension ESLint trên VS Code
Hướng kết hợp (dự án cũ): Dùng Biome làm formatter và áp dụng các lint rule nó đã có. Giữ ESLint cho phần còn thiếu — framework plugins, custom rules, security linting. Chạy cả hai trong CI. Đây là cách được xem là tốt nhất hiện nay cho team muốn có tốc độ mà không cần cắt bỏ hết một lúc. Team hoàn thiện chiến lược này thường cũng chuyển sang Vitest cho testing — triết lý ưu tiên tốc độ tương tự áp dụng cho test runner.
Lưu ý {#caveats}
Ba điều bài viết này không kiểm tra:
- Hệ thống custom rule của Biome (GritQL) — ra mắt trong v2.0 nhưng còn ở iteration đầu. Chúng tôi không thử port các custom rule production thực tế. Đừng giả định nó xử lý được trường hợp của bạn mà không kiểm thử trước.
- Các plugin tương đương cho framework — không có kiểm thử độc lập về mức độ Next.js hay Vue built-in của Biome với các pattern framework thực tế. Các bảng rule ở trên lấy từ tài liệu của Biome; hãy kiểm tra lại với plugin thực tế bạn đang dùng.
- Edge case type-aware phức tạp — con số 75–85% coverage lấy từ tài liệu của Biome và kiểm thử của BetterStack. Các type pattern cụ thể của bạn có thể rơi vào phần 15–25% còn thiếu.
Không có affiliate link trong bài viết này. Biome là open-source; chúng tôi không có quan hệ thương mại ở đây.