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

こんにちは、しおです
最近、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を利用して開発してますが、これといって困ることはまだなく、素早くコードの整頓ができるので重宝しています。
知見が溜まったら他のプロジェクトでも利用していきたいと思っています。