2025.01.15

BiomeとESLintの比較と実際に使用した感想【2025年1月時点】

はじめに

みなさんはJavaScriptやTypeScriptで開発する際に、linterやformatterを使用していますか?

コードに統一感を持たせるために利用されるlinterやformatterですが、これらのツールの中でも、ESLintとPrettierは特に広く知られている一方で、最近ではBiomeも注目を集めており、その名前を耳にする機会が増えてきました。

両ツールを実際に使用した筆者が比較と現状の感想について書きました。

LinterとFormatterとは

Linterの役割と目的

Linterは、コードの品質を向上させるためのツールで、特定のルールに基づいてコードを解析します。たとえば、未使用の変数や非推奨の記法、文法エラーなどを検出し、開発者に警告を与えます。これにより、バグの発生を未然に防ぐことができ、コードの可読性や保守性を向上させることができます。

Formatterの役割と目的

Formatterは、コードの見た目を統一するためのツールで、自動的にインデントやスペース、改行の位置を調整します。例えば、複数の開発者が共同で作業する場合、Formatterを使用することでコードのスタイルが統一され、レビューやメンテナンスが容易になります。また、手動でスタイルを調整する手間が省けるため、開発の効率も向上します。

LinterとFormatterの違いと組み合わせの利点

LinterとFormatterは、それぞれ異なる目的を持つツールですが、相互補完的な役割を果たします。Linterはコードの品質やエラー検出を主な目的とし、Formatterはコードのスタイルを整えることに注力しています。この二つを組み合わせることで、コードの品質と見た目の両方を向上させることができ、開発者の生産性を高めることができます。

ESLintとは

ESLintは2013年にリリースされて以来、JavaScriptのLinterツールとして広く利用されてきました。その後、TypeScriptやフロントエンドフレームワークへの対応も進化し、業界標準的なポジションにあります。また、公式の推奨ルールセット(eslint:recommended)や、Airbnbが提供するeslint-config-airbnbのようなコミュニティ主導のルールセットが多く、柔軟かつ複雑なカスタマイズが可能です。 https://www.npmjs.com/package/eslint-config-airbnb

一方で、ルールセットやプラグインを組み合わせるためにoverrideやextendsという仕組みがあり、この仕組みがややこしいという問題もありました。この問題についてはflatconfigで解決されました。詳しくはこちらの記事で解説しました。

また、ESLintは一部formatter的な機能もあったため、Prettierと組み合わせて使うことが多いと思います。

新しいプロジェクトを開始するたびにESLintの設定を行う必要があり、そのカスタマイズ性の高さゆえに設定が煩雑になり、開発者が『設定疲れ』を感じることも少なくありませんでした。

Biomeとは

BiomeはこのようなESLintの設定疲れを解決することを目指して登場したツールです。公式では『Toolchain of the web』と謳っています。

Biomeはlinterとformatterの機能を併せ持っており、ESLintやPrettierが分担していた役割を1つのツールで実現することを目指しています。Rustで実装されており、非常に高速な動作が特徴です。現在も発展途上ありで、対応するフレームワークはこれからさらに増えていくことが期待されています。

また、Biomeは設定がシンプルで、複数のプラグインを準備する必要がないため、すぐに開発を始められることが特徴です。

ESLintとBiomeの設定方法の比較

次に、ESLintとBiomeの設定方法を見比べていきます。ここではReactとTypeScriptのプロジェクトで使用することを想定して書きます。

使用するバージョンは下記の通りです。

  • React: 18.3.1
  • TypeScript: 5.5.3
  • ESLint: 9.16.0
  • Prettier: 3.3.3
  • Biome: 1.9.2

ESLintの設定方法

ReactのプロジェクトにESLintを導入するにはまず次のライブラリをインストールします。

$ pnpm install eslint prettier eslint-config-prettier @eslint/js @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-import-resolver-typescript globals typescript-eslint -D

インストールするものだけでもたくさんあります。これらのライブラリを組み合わせ、次のような設定ファイルを書きます。こちらは筆者が実際に使用している設定の一部です。必須の設定だけ載せています。

const eslint = require('@eslint/js')
const globals = require('globals')
const tsEsLintParser = require('@typescript-eslint/parser')
const tseslint = require('typescript-eslint')
const prettierConfig = require('eslint-config-prettier')
const importPlugin = require('eslint-plugin-import')

module.exports = tseslint.config(
  {
    ignores: ['node_modules', 'dist'],
  },
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
      },
      parser: tsEsLintParser,
      ecmaVersion: 'latest',
      sourceType: 'module',
      parserOptions: {
        ecmaFeatures: {
          jsx: true,
        },
      },
    },
  },
  eslint.configs.recommended,
  tseslint.configs.recommendedTypeChecked,
  // prettierの設定
  prettierConfig,
  {
    // pluginごとのrulesを設定していく。ここから先は好みなので任意
    rules: {
      ..., // 省略
    },
  },
)

設定ファイルの全体はこちらで公開しています。

https://github.com/andmohiko/next-hono-monorepo/blob/main/packages/eslint-config/index.js

Biomeの設定方法

ReactのプロジェクトにBiomeを導入するにはまず次のライブラリをインストールします。

$ pnpm install @biomejs/biome -D

インストールするものは一つで済みました。設定ファイルは次のようになります。

{
  "$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
  "formatter": {
    "enabled": true,
    "indentStyle": "space",
    "indentWidth": 2
  },
  "javascript": {
    "formatter": {
      "semicolons": "asNeeded",
      "quoteStyle": "single",
      "trailingCommas": "all"
    }
  },
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true
    }
  },
  "files": {
    "ignore": ["node_modules/", "dist/", "dev-dist/"]
  }
}

ESLintのrulesのようにさらに細かく設定することもできます。

ESLintとBiomeの比較

それでは、両方を使った筆者がいくつかの観点で比較してみます。

※これは2025年1月時点での感想です。今後のアップデートや開拓次第で意見が変わる可能性があります。

開発の始めやすさ

設定項目の多さや煩雑さで比べると、設定方法を見てわかる通り、Biomeの方が簡単です。

一方で、ESLintを長年使い続けている人は、ESLintの設定ファイルという資産があり、秘伝のタレとして使い回すことができるため、ESLintの設定疲れをそれほど感じない場合もあります。

また、ESLintはFlat Configへの移行が面倒でBiomeに乗り換えたいという声も聞きますが、筆者自身の経験では、Flat Configへの移行は意外とスムーズに行えたため、Flat Configの存在がBiomeへ乗り換える理由にはなりませんでした。

ちなみにFlat Configへの移行方法については下記の記事で解説しています。 https://www.andmohiko.dev/blog/monorepo-eslint-flat-config

動作の軽さ

BiomeはRustで実装されており、従来のJavaScript製ツールよりも圧倒的に高速です。特にコードベースが大きくなるほど、静的解析やコード整形の速度の違いを感じられるでしょう。

また、Biomeはモノレポに対応しており、軽量なのでモノレポのルートで実行してもストレスがありません。ESLintはモノレポのルートで実行すると若干の遅さを感じる場合があります。そのため、ESLintを快適に使用するには、設定をパッケージ化して他パッケージにインストールするという手順を踏むことをおすすめします。この点についても詳しくは以下の記事で解説しています。 https://www.andmohiko.dev/blog/monorepo-eslint-flat-config

開発規模での使い分け

大規模なアプリケーション開発や、参加者の多いプロジェクトでは、より厳密なルール設定が求められることもあると思います。Biomeはまだ発展途上であり、現状ではESLintの方が複雑かつ細かい設定が可能なため、大規模プロジェクトではESLintを選びたくなると思います。特に歴史のあるプロジェクトでは、既存のESLintの設定ファイルの資産が大きく、今からBiomeに乗り換えることは少しもったいない感じがします。この点は、今後のBiomeのアップデートで特に意見が変わるところかもしれません。

フレームワークごとの使い分け

BiomeはReact, TypeScriptには対応しているため、ReactやNext.jsのプロジェクトではBiomeを使用することを検討することが増えてくるかもしれません。一方で、VueやAstroにはまだ一部対応しておらず、たとえばAstroではHTML部分のフォーマットにはまだ対応していないため、Prettierを併用する必要があります。それでも、一から設定を始める場合、BiomeとPrettierを併用する方が設定コストが低いと感じました。Astroで爆速で終わらせたいWeb制作を始めるときはBiomeを選びたいです。対応フレームワークの幅も今後のBiomeのアップデートに期待です。

さいごに

本記事では、JavaScriptやTypeScriptの開発において広く利用されているESLintと、最近注目を集めているBiomeを比較しました。

実際に両方を使った感想としては、筆者が普段関わっている開発規模だと、今はまだESLintの方を選び続けたいと感じました。今後規模の大きい開発に関わったときにはBiomeの動作の軽さをとるかもしれません。