Biomeを使ってフォーマットとリントを1ツールで完結させる

shio

こんにちは、しおです

最近、TypeScriptの開発の際に
Biomeというフォーマッターとリンターを兼ねているツールを利用し始めました。

今回はそのBiomeについて使い方などまとめていこうと思います!

Biomeとは

最初にBiomeの簡単な説明ですが、
BiomeはJavaScript、TypeScriptなどのフォーマットやリントを1つで完結できるツールです。

JSやTSの開発の際は、リンターとしてESLint + フォーマッターとしてPrettier
という2つのツールを使うことが多かったかと思います。
ただ、ESLint側のルールとPrettier側のルールがかち合ってしまう、
それぞれの設定を用意しないといけない、という状況が発生することもありました。

それがBiomeを使うと1つのツールだけで完結できてしまうという優れものです。

Biomeのサイトはこちらになります。

使い方

早速ですがTypeScriptで開発する際の使い方から紹介します。
私の個人開発ではbunを利用しているため、パッケージ管理のコマンドなどはbunベースになりますが、
npm, yarn, pnpm, denoまで例があります。
参考こちら

さて、まずはインストールからです。
他のパッケージと同様にパッケージマネージャからインストールします。

bun add --dev --exact @biomejs/biome

インストールができたら設定ファイルを作成します。

bunx biome init

このコマンドでデフォルトの設定ファイルbiome.jsonが作成されます。
あとは実行するだけでOKです。

# フォーマットの実行
bunx biome format ./src

# リントの実行
bunx biome lint ./src

また check でフォーマットとリントの両方を実行できます。

bunx check ./src

オプションで--writeを指定すると、自動で修正もしてくれます。

bunx check --write ./src

ここまでで基本的な準備はOKです。

さらに自分はpackage.jsonにスクリプトを追加してサクッと走らせることができるようにしています。

  "scripts": {
    ...
    "format": "bunx biome format --write ./src",
    "lint": "bunx biome lint --write ./src",
    "check": "bunx biome check --write ./src",
    ...
  }

Biomeの設定ファイル

initのコマンドで初期設定の設定ファイルが生成されたと思います。

もし既にESLint + Prettierで開発していた場合は、それと同じ設定にしたいという思いになりますが、
なんとmigrateコマンドを使ってBiomeの設定ファイルにマッピングしてくれるんです!
既存の.prettierrc.json.eslintrc.jsonなどを読み込んでBiomeの設定に移行してくれます。

もちろん、migrateの必要がなければ実施不要です。

biome migrate eslint --write
biome migrate prettier --write

詳細はこちらを参照ください。

さてここから、設定ファイルを確認していこうと思うのですが、
設定項目の数が膨大なため、個人的によく変更する項目をピックアップします。

formatter.indentStyle

インデントのスタイルに関する設定です。
Biomeではデフォルトが "tab" になるようなので、好みに合わせて spaceに変更しています。

{
  "formatter": {
    "indentStyle": "space"
  }
}

files.ignore

これは除外ファイルの設定になります。
自動生成したコードなど、リンターにかけたくないものがあれば適宜追加します。

例えば、下記のような感じです。

{
  "files": {
    "ignore": ["*.generated.ts", "hoge.ts"]
  }
}

設定ファイルの全容は下記のような感じにしています。

{
  "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
  "vcs": {
    "enabled": false,
    "clientKind": "git",
    "useIgnoreFile": false
  },
  "files": {
    "ignoreUnknown": false,
    "ignore": ["*.generated.ts"]
  },
  "formatter": {
    "enabled": true,
    "indentStyle": "space"
  },
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true
    }
  },
  "javascript": {
    "formatter": {
      "quoteStyle": "double"
    }
  }
}

その他の設定についてはデフォルトで利用することが多いですが、特に違和感なく使えています。
設定の詳細はこちらにまとまっているので、好みに合わせてカスタムできます。

リンターのルールについて

BiomeではESLintと同じルールがおおむね実装されており、
プラグインのルールに相当するものも含まれています。

私の場合はrecommendedのルールを有効にして利用しています。

Biomeのルール名はESLintとは異なる命名になっています。
特定のルールの設定をしたい場合は下記のルール対応から探すとお目当てのルールが見つかるかと思います。
ルール対応

またBiomeでは、Analyzerの機能としてimport文の順番をソートする機能が別途実装されています。
ESLintではプラグインを利用して同様のルールを追加する必要がありましたが、Biomeではcheckのコマンドでimport文をソートしてくれます。

ただし、グルーピングなどはESLintとは違う挙動になります。
詳細はこちらから確認できます。

VSCodeでの利用

もちろんCLIからの実行だけではなく、エディタの拡張機能を入れて利用することもできます。

自分はVSCodeを利用しているので、VSCodeの拡張を入れます。
こちらからエディタでの拡張機能を確認できます。

拡張機能を入れたあとは、フォーマッタの設定をBiomeにするだけでOKです。

CI環境での利用

そしてBiomeにはCI環境で実行を想定したコマンドが用意されています。
biome ciです。

処理の内容はcheckと同様の処理なのですが、
こちらはファイルの変更はせずに読み取りだけで実行されるコマンドになります。
CI上でチェックに引っかかった場合にエラーにさせるだけで、ファイルの変更はしたくない時に使えるものです。

GitHub Actionsで使う場合はBiomeをセットアップするアクションが公式から展開されているので、
それを利用してBiomeの準備をしてbiome ciのコマンドを走らせることが可能です。

参考: https://biomejs.dev/recipes/continuous-integration/

所感

Biomeを利用して開発してますが、これといって困ることはまだなく、素早くコードの整頓ができるので重宝しています。
知見が溜まったら他のプロジェクトでも利用していきたいと思っています。

AUTHOR
shio
shio
記事URLをコピーしました