· 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ảnESLint + PrettierBiomeTốc độ tăng
Lint 10.000 files45.2 s0.8 s56×
Format 10.000 files12.1 s0.3 s40×
Lint dự án 500 files30+ s2–3 s10–20×
Pre-commit hook, monorepo TS lớn27.2 s1.8 s15×
Type-aware lint, backend 200 files15 s6 s2.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 importCác trường hợp cơ bản đã có
React hooks (useExhaustiveDependencies)
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

EditorTrạng thái
VS CodeExtension chính thức — format-on-save, diagnostics, code actions
JetBrains / WebStormTích hợp sẵn từ WebStorm 2024.3+, không cần plugin
Neovim / EmacsQua 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, hay eslint-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:

  1. 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.
  2. 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.
  3. 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.

Tham khảo