🐸

Biome+lefthookで始める高速commit/push時自動チェック

2024/04/29に公開

Biomeとは

Biomeは、コードのフォーマットと静的解析を一つのプラットフォームで提供するツールです。
PrettierやESLintがそれぞれフォーマットとリントの機能に特化しているのに対し、Biomeはこれらの機能を統合しています。
PrettierやESLintでそれぞれ面倒な設定をすることなく、かつ高速にチェックすることができます。また、デフォルトのフォーマットやルールが豊富であり、追加で設定をする量が少ないのも良い点の一つです。

https://biomejs.dev/ja/

Lefthookとは

Lefthookは、Gitのフックを管理し、プロジェクトの開発プロセスを自動化するための高速で使いやすいツールです。Gitフックを使うことで、コミットやプッシュの前に特定のスクリプトを実行し、コードの品質を保持したり、一貫性を確保するためのチェックを行えます。
js環境ではHusky+lint-stagedを用いて同様の動作を行えますが、Lefthookはその上位互換と考えることができます。

https://github.com/evilmartians/lefthook

Biomeの環境構築

パッケージマネージャを使用してインストールします。
他にもyarn, pnpm, bunを使ってインストール可能です。

https://biomejs.dev/ja/guides/getting-started/#インストール方法

npm install --save-dev --save-exact @biomejs/biome

続いて、設定ファイルであるbiome.jsonを作成します。

npx @biomejs/biome init

このコマンドを実行すると、以下のようなファイルが生成されます。

biome.json
{
  "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json",
  "organizeImports": {
    "enabled": false
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true
    }
  }
}

linterの設定について

linterはこの時点でrecommendedがtrueになっており、豊富なルールが適用されています。
含まれているルールの対応について以下の記事がわかりやすいです。

https://zenn.dev/cybozu_frontend/articles/biome-eslint-compatibility

公式から最新のrecommendを確認したい場合は以下のページで確認できます。

https://biomejs.dev/ja/linter/#推奨ルール

ルールの一覧については以下のページで確認できます。
アクセシビリティやセキュリティ、パフォーマンスなど多くのルールがあることがわかります。

https://biomejs.dev/ja/linter/rules/

同じく、公式から最新の対応状況を確認したい場合は以下のページで確認できます。
ESLintやそのプラグイン、typescript-eslintなどの互換がなされていることがわかります。

https://biomejs.dev/ja/linter/rules-sources/

ルールの追加方法

試しに、使用していない変数がある場合に感知されるルールであるnoUnusedVariablesの設定をerrorにしてみます。ちなみにこのルールはrecommendedルールではありません(どうして)。

https://biomejs.dev/linter/rules/no-unused-variables/

ページの上記にDiagnostic Category: lint/correctness/noUnusedVariablesとあると思います。大抵このカテゴリ通りにオブジェクトを表記すれば反映されます。

biome.json
{
  "$schema": "https://biomejs.dev/schemas/1.7.1/schema.json",
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true,
      "correctness": {
        "noUnusedVariables": "error"
      }
    }
  }
}

formatterの設定

デフォルトで以下のformatが設定されています。

https://biomejs.dev/ja/formatter/#設定

biome.json
{
  "formatter": {
    "enabled": true,
    "formatWithErrors": false,
    "ignore": [],
    "attributePosition": "auto",
    "indentStyle": "tab",
    "indentWidth": 2,
    "lineEnding": "lf",
    "lineWidth": 80
  },
  "javascript": {
    "formatter": {
      "arrowParentheses":"always",
      "bracketSameLine": false,
      "bracketSpacing": true,
      "jsxQuoteStyle": "double",
      "quoteProperties": "asNeeded",
      "semicolons": "always",
      "trailingComma": "all"
    }
  },
  "json": {
    "formatter": {
      "trailingCommas": "none"
    }
  }
}

これを変更したい場合は、変更したい内容のみをbiome.jsonに追記すれば良いです。
設定の仕様については公式のconfigurationが参考になります。

https://biomejs.dev/reference/configuration/#formatter

CLIから実行できるようにする

要はnpm run lintやらでlinterやらformatterやらが走るようにします。
package.jsonを以下のように編集します(checkだけでも十分かも)。
<files>./srcなど対応させたいディレクトリにしてください。

package.json
"lint": "biome lint <files>",
"format": "biome format <files>",
"check": "biome check <files>",
"lint:fix": "biome lint --apply <files>",
"format:fix": "biome format <files> --write",
"check:fix": "biome check --apply <files>"

VSCodeとの連携

VSCodeの拡張機能が存在します。これで保存時に自動フォーマットができます。

https://marketplace.visualstudio.com/items?itemName=biomejs.biome

vscodeのsetting.jsonに以下を追記します。
(そのプロジェクト限定にしたい場合は、.vscode/settings.jsonに新規/追記してください)

vscode.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "biomejs.biome",
  "editor.codeActionsOnSave": {
    "quickfix.biome": "explicit",
    "source.organizeImports.biome": "explicit"
  }
}

デフォルトformatterは変えたくない場合

言語で指定することが可能です。

settings.json
{
  "editor.defaultFormatter": "<other formatter>",
  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome"
  }
}

Lefthookの環境構築

https://github.com/evilmartians/lefthook?tab=readme-ov-file#install

色々記事やドキュメントを見ると、以下の順番が前後したりしますが、一応自分が試したやり方を記述します。
macの場合はhomebrewからCLIをインストールできます。

brew install lefthook

他の環境の場合は以下を参考にしてください。

https://github.com/evilmartians/lefthook/blob/master/docs/install.md#-winget-for-windows

パッケージマネージャからインストールします。
(pnpmやyarn, bunでもインストール可能です)

npm install lefthook --save-dev

lefthook.ymlに以下を記述します。
<files>の部分は./srcなど対応させたいディレクトリを指定してください。

lefthook.yml
pre-commit:
  commands:
    check:
      glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}"
      run: npx biome check --apply --no-errors-on-unmatched --files-ignore-unknown=true <files> && git update-index --again

pre-push:
  commands:
    check:
      glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}"
      run: npx biome check --no-errors-on-unmatched --files-ignore-unknown=true <files>

プロジェクトにgit hookに反映させます。

lefthook install

あとはcommit / pushするだけ

これでもうcommitやpushをするたびに、自動的にチェックが走るようになります。やったぜ。

終わりに

これまでprettier + ESLint + Husky + lint-stagedみたいな構成を長年続けてきたのですが、設定がアホ面倒だったり実行時間がそこそこ長くなったりしていたのですが、今回の構成に変えて爆速自動チェックができて非常に満足です。
皆さんもぜひ試してみてください。

Discussion