- フロントエンド(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 ルールを整理してチームに共有した後で移行していければと思っています。
それでは皆様良いお年を 🎍