ESLint vs oxlint vs Biome 2026年版【既存プロジェクト移行コスト比較】
プロジェクトの品質維持に不可欠なリンター。JavaScript/TypeScript開発では長らくESLintがデファクトスタンダードでした。しかし、近年、その座を脅かす新星が登場しています。Rust製で圧倒的な速度を誇るoxlintと、リンター・フォーマッター機能を統合したBiomeです。
「既存のESLintプロジェクトに導入するなら、どれを選べば良いのか?」 「速度は速いと聞くけれど、実際の移行コストはどれくらいなのか?」
このような疑問を抱えている方も多いのではないでしょうか。本記事では、2026年における各ツールの現状と、既存プロジェクトへの移行コストに焦点を当てて徹底比較します。速度ベンチマーク、対応ルール数、設定ファイル移行コスト、そしてCI実行時間の削減効果まで、多角的に検証していきましょう。
一言で言うと
各ツールの特徴を10字以内でまとめます。
- ESLint: 柔軟な標準リンター
- oxlint: 爆速Rust製リンター
- Biome: 統合開発ツール
比較表
| 項目 | ESLint | oxlint | Biome |
|---|---|---|---|
| 開発言語 | JavaScript | Rust | Rust |
| 主な機能 | リンター | リンター | リンター、フォーマッター |
| 速度 | 比較的遅い(プラグイン数に依存) | 最速(ESLintの数倍〜数十倍) | 高速(ESLintの数倍) |
| 対応ルール数 | 非常に豊富(プラグインエコシステム) | 主要ルールをカバー、ESLint互換モードあり | 主要ルールをカバー、独自のルール体系 |
| 設定ファイル | .eslintrc.* (JS, JSON, YAML) | oxlint.json (ESLint互換モードあり) | biome.json |
| 移行コスト | 基準となるためゼロ | 低〜中(ESLint互換モードで低減) | 中〜高(独自のルール体系へのマッピング) |
| 学習コスト | 幅広いエコシステム、プラグイン理解が必要 | ESLintユーザーには比較的低い | 新規ユーザーには低い、移行者には再学習 |
| CI実行時間削減効果 | なし(現状維持) | 大いに期待できる(大幅な短縮) | 大いに期待できる(大幅な短縮) |
| コミュニティ規模 | 最大、非常に活発 | 成長中、Oxcエコシステムの一部 | 成長中、活発な開発 |
| インストール | npm install eslint | npm install oxlint | npm install @biomejs/biome |
| 特徴 | 豊富な拡張性、業界標準 | Oxcエコシステムの一員、パフォーマンス重視 | 統合ツールチェイン、シンプルさ重視 |
実際のコマンド比較
既存のJavaScript/TypeScriptプロジェクトで、各ツールの動作を比較します。ここでは、プロジェクトルートに src ディレクトリがあり、その中に複数のファイルがあると仮定します。
ESLintでの実行
まず、ESLintが導入されている一般的なプロジェクトの構成です。
# ESLintのインストール(もし未導入の場合)
npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
# .eslintrc.js ファイルの作成例
# module.exports = {
# parser: '@typescript-eslint/parser',
# plugins: ['@typescript-eslint'],
# extends: [
# 'eslint:recommended',
# 'plugin:@typescript-eslint/recommended',
# ],
# root: true,
# env: {
# node: true,
# jest: true,
# },
# ignorePatterns: ['.eslintrc.js'],
# rules: {
# // ここにプロジェクト固有のルールを追加
# },
# };
# package.json の scripts に lint コマンドを追加
# {
# "scripts": {
# "lint": "eslint \"{src,apps,libs}/**/*.ts\" --fix"
# }
# }
# ESLintの実行
npm run lint
ESLintは設定ファイル (.eslintrc.js など) に基づいてコードを解析し、問題を報告します。--fix オプションを付ければ、自動修正可能な問題を修正します。大規模なプロジェクトでは、この npm run lint の実行に数十秒から数分かかることがあります。
oxlintでの実行
oxlintはRust製の高速リンターです。Oxcプロジェクトの一部として開発されており、Rolldown (Viteのバンドラー) やNuxtなど、多くのプロジェクトでそのパーサーが利用されています。リンター機能であるoxlintは、既存のESLint設定をある程度活用できる互換モードも提供します。
1. oxlintのインストール
npm install --save-dev oxlint
2. oxlintの実行
ESLintの実行速度に不満がある場合、まず既存のESLint設定を読み込む形でoxlintを試すことができます。
# ESLint互換モードでoxlintを実行
# (package.jsonのscriptsで "lint": "oxlint --eslint-compatible" と設定することも可能)
npx oxlint --eslint-compatible
このコマンドは、oxlint が内部的にESLintの設定ファイルを探し、可能な限りそのルールを適用してリンティングを行います。ESLintと全く同じ結果になるわけではありませんが、多くの一般的なルールはカバーされます。
CI実行時間の削減効果: 例えば、ESLintの実行に5分かかっていたCIステップがあったとします。oxlintを導入することで、この実行時間が30秒〜1分程度に短縮される可能性があります。これは、CIパイプライン全体の時間を大幅に削減し、開発者のフィードバックサイクルを高速化することに直結します。特に大規模なモノレポや頻繁なコミットがあるプロジェクトでは、その効果は絶大です。
3. oxlintのフォーマット機能(oxfmt)
oxlintはリンターに特化していますが、Oxcエコシステムにはフォーマッターのoxfmtも存在します。
# oxfmtのインストール
npm install --save-dev oxfmt
# oxfmtの実行
npx oxfmt src/**/*.ts --fix
oxfmtはPrettierのような役割を担い、コードの整形を行います。リンターとフォーマッターが別ツールとして提供される点は、ESLintとPrettierの組み合わせに似ています。
Biomeでの実行
Biomeは、リンター、フォーマッター、そして将来的にはバンドラーやコンパイラーといった機能を統合することを目指すツールです。独自のルールセットと設定ファイル形式を持ち、一貫した開発体験を提供します。
1. Biomeのインストール
npm install --save-dev @biomejs/biome
2. Biomeの設定ファイル生成
Biomeは独自の biome.json ファイルを使用します。初回は init コマンドで生成します。
# biome.json の生成
npx @biomejs/biome init
このコマンドを実行すると、プロジェクトルートに biome.json が生成されます。このファイルでリンターやフォーマッターのルールを設定します。
3. Biomeの実行
Biomeは lint と format の両方の機能を持ちます。
# リンティングの実行
npx @biomejs/biome lint src/**/*.ts
# フォーマットの実行(自動修正)
npx @biomejs/biome format src/**/*.ts --write
Biomeはリンティングとフォーマットを統合しているため、format コマンドだけでコードの整形と一部のリンティング問題を修正できます。これにより、開発者は複数のツールを使い分ける手間が省けます。
CI実行時間の削減効果: Biomeもoxlintと同様にRust製であり、ESLintと比較して高いパフォーマンスを発揮します。リンティングとフォーマットを単一のツールで実行できるため、CIパイプライン上でのステップ数を減らし、その分のオーバヘッドも削減できます。例えば、リンティングとフォーマットの両方に合計7分かかっていたプロセスが、Biomeの導入により1分半程度に短縮される、といった効果が期待できます。
こんな人にはoxlintがおすすめ / こんな人にはBiomeがおすすめ
各ツールの特性を踏まえ、プロジェクトの状況や開発チームの志向性に合わせて最適な選択肢を検討しましょう。
oxlintがおすすめな人
- ESLintの実行速度に不満がある: 特に大規模なプロジェクトでESLintの実行が遅いと感じているなら、oxlintの爆速性能は大きなメリットになります。
- CI/CDのLintステップを高速化したい: CIパイプラインの実行時間を短縮し、開発サイクルを加速したい場合に最適です。
- 既存のESLintルールを活かしたい:
--eslint-compatibleオプションにより、ESLintの設定をある程度引き継ぎたい場合に移行コストを抑えられます。 - フォーマットはPrettierなど既存ツールで十分: リンターとフォーマッターを分離して運用することに抵抗がない場合に適しています。
- Rust製ツールのエコシステムに興味がある: Oxcプロジェクトの一員として、将来的なツールの統合や進化に期待する方にも良い選択です。
Biomeがおすすめな人
- リンターとフォーマッターを統合したい: 複数のツールを管理する手間を省き、単一のツールでコード品質を保ちたい場合に非常に有効です。
- 新しいプロジェクトで一からツールチェインを構築したい: 既存のESLint設定に縛られず、クリーンな状態で最新のツールを導入したいプロジェクトに最適です。
- ESLintの設定が複雑で疲弊している: BiomeはESLintの複雑な設定ファイルよりもシンプルで、直感的な設定が可能です。
- 将来的なバンドラー統合など、より包括的なツールを求めている: Biomeはリンター、フォーマッターに留まらず、最終的にはコンパイラーやバンドラー機能も統合するビジョンを持っています。長期的な視点でツールチェインをシンプル化したい場合に検討価値があります。
移行する場合の手順
既存のESLintプロジェクトからoxlintまたはBiomeへ移行する際の手順と注意点を説明します。
ESLintからoxlintへの移行手順
oxlintはESLint互換モードを提供しているため、比較的スムーズな移行が可能です。
- oxlintのインストール:
プロジェクトの依存関係に
oxlintを追加します。npm install --save-dev oxlint package.jsonのscriptsを変更: 既存のlintコマンドをoxlintの実行に置き換えます。ESLint互換モードを有効にすることで、既存のESLint設定を読み込もうとします。{ "scripts": { "lint": "oxlint --eslint-compatible ." } }--eslint-compatibleオプションは、ESLintの設定ファイル(.eslintrc.*)を検出し、そのルールを可能な範囲で適用します。- リンティングの実行と結果の確認:
npm run lintを実行し、既存のESLintでの結果と比較します。
oxlintがESLintの全ルールを完全に再現するわけではありません。特に、カスタムプラグインや複雑なESLintルールを使用している場合、oxlintでは検出されない、または異なる挙動を示す警告があるかもしれません。npm run lint - 未対応ルールや異なる挙動への対応:
ESLintとの差異が生じた場合、以下のいずれかの対応を検討します。
- oxlintのルールを調整して対応する。
- oxlintで対応できないルールは一時的に無効化するか、ESLintとoxlintを併用する。
- oxlintのGitHubリポジトリでIssueを立て、対応を要望する。
- ESLintの削除(任意):
oxlintの導入が成功し、ESLintが不要になったと判断できれば、ESLintとその関連プラグインを削除します。
npm uninstall --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
ESLintからBiomeへの移行手順
Biomeは独自のルール体系と設定ファイル形式を持つため、oxlintよりも移行コストが高くなる傾向があります。しかし、リンターとフォーマッターを統合できるメリットがあります。
- Biomeのインストール:
プロジェクトの依存関係に
@biomejs/biomeを追加します。npm install --save-dev @biomejs/biome biome.jsonの生成: プロジェクトルートでBiomeの設定ファイルを生成します。
これにより、基本的なnpx @biomejs/biome initbiome.jsonファイルが作成されます。- 既存のESLintルールからBiomeルールへのマッピング:
このステップが最も重要で、時間のかかる作業です。
- 既存のESLintルール(
.eslintrc.*)を一つずつ確認し、それに対応するBiomeのルールをbiome.jsonに設定します。 - BiomeはESLintの一部のルールに直接対応する変換ツールを提供している場合もありますが、多くは手動でのマッピングが必要になります。
- 例えば、
no-unused-varsはBiomeのlinter.rules.js.noUnusedVariablesに相当します。 - 詳細なマッピングはBiomeの公式ドキュメントを参照してください。
- 既存のESLintルール(
package.jsonのscriptsを変更: 既存のlintコマンドをBiomeの実行に置き換え、必要であればformatコマンドも追加します。{ "scripts": { "lint": "biome lint .", "format": "biome format . --write" } }- リンティングとフォーマットの実行、結果の確認:
npm run lintとnpm run formatを実行し、既存のESLint/Prettierでの結果と比較します。
Biomeはフォーマット時に一部のリンティング問題を修正するため、両方を実行して期待通りのコード品質が保たれているか確認することが重要です。npm run lint npm run format - Prettierなどのフォーマッターの削除(任意):
Biomeのフォーマッター機能で十分と判断できた場合、Prettierなどの既存のフォーマッターツールを削除します。
npm uninstall --save-dev prettier - ESLintの削除(任意):
Biomeの導入が成功し、ESLintが不要になったと判断できれば、ESLintとその関連プラグインを削除します。
npm uninstall --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
関連ページ
参考文献
- oxc.rs: Oxidation Compiler
- Biome Documentation
- ESLint Documentation
- Oxlint vs ESLint: A Performance Deep Dive
- Migrating from ESLint to Biome