KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

All TypeScriptのMonorepoのlinterをESLintからbiomeにしたらlintが25倍速くなった🚀

  • フロントエンド(React.js TypeScript)
  • バックエンド(Node.js TypeScript)
  • インフラ(CDK TypeScript)

の Monorepo の linter を ESLint からbiomeに変更したら lint が約50秒かかっていたのが大体2秒になって嬉しかったので共有します。

こんにちは、カケハシでソフトウェアエンジニアをしている加藤です。

本エントリはカケハシ Part 2 Advent Calendar 2023の 21 日目の記事です。 ぜひ Part1 も 2 も見て頂けたらと思います。

同じカケハシ社内の他のチームでは以前 コードフォーマッターを Prettier から dprint にしたら 10 倍以上速くなった話 🚀 で紹介した通り、dprintを導入していますが、今回僕たちのチームは biome を導入してみました。

導入してみた理由としては Compare NPM Packagesで比較して Download 数と Github Star 数と勢いで試してみました。

biome とは

Rust 製の lint, format が高速に実行できるツールです。

導入する

pnpm add --save-dev --save-exact @biomejs/biome

設定する

pnpm dlx @biomejs/biome init

biome.jsonが生成されます。

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

実行する

pnpm dlx @biomejs/biome lint .

dprint との比較

dprint は formatter のみで、biome は linter と formatter が一緒になっており

  • biome は linter, formatter まで同一のbiome.json で管理できる
  • dprint とは違い biome は prettier の plugin がないので即移行ができない という違いがあります。

ignore の設定

計測する前に条件を合わせたいので ignore だけでも揃えておきます。 .eslintignoreの設定をbiome.json へ移植すれば良さそうです。

以下 ignore 設定の抜粋です。

"linter": {
  "enabled": true,
  "rules": {
    "recommended": true
  },
  "ignore": [
    "*.d.ts",
    "dist/**/*",
    "node_modules/**/*",
    "build/**/*",
    "public/**/*",
    "bundle/**/*",
    "out/**/*",
    "generated/**/*",
    ".storybook/**/*",
    "cdk.out/**/*",
  ]
}

速度比較

複数回実行して結果を比較する

biome

❯ hyperfine --warmup 3 'pnpm dlx @biomejs/biome lint .' -i
Benchmark 1: pnpm dlx @biomejs/biome lint .
  Time (mean ± σ):      1.850 s ±  0.458 s    [User: 2.197 s, System: 0.361 s]
  Range (min … max):    1.577 s …  3.011 s    10 runs

ESLint

❯ hyperfine --warmup 3 'pnpm run lint'
Benchmark 1: pnpm run lint
  Time (mean ± σ):     45.304 s ±  2.392 s    [User: 55.311 s, System: 5.365 s]
  Range (min … max):   39.439 s … 46.802 s    10 runs

45.304 / 1.850 = 24.5 倍

大体 25 倍ほど高速化していますね 🎉

移行は大変じゃないのか?

はい、実は執筆時点で 1200 個 error が出ているので即移行というわけにはいかなそうです。

Diagnostics not shown: 31525.
Checked 2189 file(s) in 462ms
Found 1287 error(s)
Skipped 2 file(s)

1 つずつ直していくのは一見大変そうなのですが どの lint に設定に違反しているのか調べて分類、修正していくとすぐ減っていくと思ってるので 今からとても楽しみです。

Biome と ESLint の lint ルールの互換性 を参考にしつつ、lint ルールを整理してチームに共有した後で移行していければと思っています。

それでは皆様良いお年を 🎍