AI

ESLint vs oxlint vs Biome 2026年版【既存プロジェクト移行コスト比較】

ESLint vs oxlint vs Biome 2026年版【既存プロジェクト移行コスト比較】

プロジェクトの品質維持に不可欠なリンター。JavaScript/TypeScript開発では長らくESLintがデファクトスタンダードでした。しかし、近年、その座を脅かす新星が登場しています。Rust製で圧倒的な速度を誇るoxlintと、リンター・フォーマッター機能を統合したBiomeです。

「既存のESLintプロジェクトに導入するなら、どれを選べば良いのか?」 「速度は速いと聞くけれど、実際の移行コストはどれくらいなのか?」

このような疑問を抱えている方も多いのではないでしょうか。本記事では、2026年における各ツールの現状と、既存プロジェクトへの移行コストに焦点を当てて徹底比較します。速度ベンチマーク、対応ルール数、設定ファイル移行コスト、そしてCI実行時間の削減効果まで、多角的に検証していきましょう。

一言で言うと

各ツールの特徴を10字以内でまとめます。

  • ESLint: 柔軟な標準リンター
  • oxlint: 爆速Rust製リンター
  • Biome: 統合開発ツール

比較表

項目ESLintoxlintBiome
開発言語JavaScriptRustRust
主な機能リンターリンターリンター、フォーマッター
速度比較的遅い(プラグイン数に依存)最速(ESLintの数倍〜数十倍)高速(ESLintの数倍)
対応ルール数非常に豊富(プラグインエコシステム)主要ルールをカバー、ESLint互換モードあり主要ルールをカバー、独自のルール体系
設定ファイル.eslintrc.* (JS, JSON, YAML)oxlint.json (ESLint互換モードあり)biome.json
移行コスト基準となるためゼロ低〜中(ESLint互換モードで低減)中〜高(独自のルール体系へのマッピング)
学習コスト幅広いエコシステム、プラグイン理解が必要ESLintユーザーには比較的低い新規ユーザーには低い、移行者には再学習
CI実行時間削減効果なし(現状維持)大いに期待できる(大幅な短縮)大いに期待できる(大幅な短縮)
コミュニティ規模最大、非常に活発成長中、Oxcエコシステムの一部成長中、活発な開発
インストールnpm install eslintnpm install oxlintnpm 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は lintformat の両方の機能を持ちます。

# リンティングの実行
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互換モードを提供しているため、比較的スムーズな移行が可能です。

  1. oxlintのインストール: プロジェクトの依存関係に oxlint を追加します。
    npm install --save-dev oxlint
    
  2. package.jsonscripts を変更: 既存の lint コマンドをoxlintの実行に置き換えます。ESLint互換モードを有効にすることで、既存のESLint設定を読み込もうとします。
    {
      "scripts": {
        "lint": "oxlint --eslint-compatible ."
      }
    }
    
    --eslint-compatible オプションは、ESLintの設定ファイル(.eslintrc.*)を検出し、そのルールを可能な範囲で適用します。
  3. リンティングの実行と結果の確認:npm run lint を実行し、既存のESLintでの結果と比較します。
    npm run lint
    
    oxlintがESLintの全ルールを完全に再現するわけではありません。特に、カスタムプラグインや複雑なESLintルールを使用している場合、oxlintでは検出されない、または異なる挙動を示す警告があるかもしれません。
  4. 未対応ルールや異なる挙動への対応: ESLintとの差異が生じた場合、以下のいずれかの対応を検討します。
    • oxlintのルールを調整して対応する。
    • oxlintで対応できないルールは一時的に無効化するか、ESLintとoxlintを併用する。
    • oxlintのGitHubリポジトリでIssueを立て、対応を要望する。
  5. ESLintの削除(任意): oxlintの導入が成功し、ESLintが不要になったと判断できれば、ESLintとその関連プラグインを削除します。
    npm uninstall --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
    

ESLintからBiomeへの移行手順

Biomeは独自のルール体系と設定ファイル形式を持つため、oxlintよりも移行コストが高くなる傾向があります。しかし、リンターとフォーマッターを統合できるメリットがあります。

  1. Biomeのインストール: プロジェクトの依存関係に @biomejs/biome を追加します。
    npm install --save-dev @biomejs/biome
    
  2. biome.json の生成: プロジェクトルートでBiomeの設定ファイルを生成します。
    npx @biomejs/biome init
    
    これにより、基本的な biome.json ファイルが作成されます。
  3. 既存のESLintルールからBiomeルールへのマッピング: このステップが最も重要で、時間のかかる作業です。
    • 既存のESLintルール(.eslintrc.*)を一つずつ確認し、それに対応するBiomeのルールを biome.json に設定します。
    • BiomeはESLintの一部のルールに直接対応する変換ツールを提供している場合もありますが、多くは手動でのマッピングが必要になります。
    • 例えば、no-unused-vars はBiomeの linter.rules.js.noUnusedVariables に相当します。
    • 詳細なマッピングはBiomeの公式ドキュメントを参照してください。
  4. package.jsonscripts を変更: 既存の lint コマンドをBiomeの実行に置き換え、必要であれば format コマンドも追加します。
    {
      "scripts": {
        "lint": "biome lint .",
        "format": "biome format . --write"
      }
    }
    
  5. リンティングとフォーマットの実行、結果の確認:npm run lintnpm run format を実行し、既存のESLint/Prettierでの結果と比較します。
    npm run lint
    npm run format
    
    Biomeはフォーマット時に一部のリンティング問題を修正するため、両方を実行して期待通りのコード品質が保たれているか確認することが重要です。
  6. Prettierなどのフォーマッターの削除(任意): Biomeのフォーマッター機能で十分と判断できた場合、Prettierなどの既存のフォーマッターツールを削除します。
    npm uninstall --save-dev prettier
    
  7. ESLintの削除(任意): Biomeの導入が成功し、ESLintが不要になったと判断できれば、ESLintとその関連プラグインを削除します。
    npm uninstall --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
    

関連ページ

参考文献

広告

-AI