いまさら Knip を知った。未使用コード削減がめちゃくちゃ捗る
JavaScript / TypeScript プロジェクトの未使用ファイル、依存、export をまとめて見つける Knip を試して、これはもっと使われてほしいと思ったメモ。
この記事を共有
TL;DR
- Knip は JavaScript / TypeScript プロジェクトの未使用ファイル、未使用 dependencies、未使用 exports を見つけてくれるツール。
- ESLint が拾いにくい「プロジェクト全体で誰からも参照されていないもの」を洗い出せるのが強い。
- Next.js、Vitest、Storybook、Vite、Nx などのツール向けプラグインもあり、現代フロントエンドの構成にかなり寄り添っている。
- いきなり削除ではなく、まずレポートを眺めて、小さい PR で掃除していくのがよさそう。
いまさら知った
Knip というツールをいまさら知った。
正直、最初は「未使用コード検出? ESLint と TypeScript でだいたい見えるのでは?」くらいに思っていた。
でも違った。Knip が見ているのは、ファイル単位、依存パッケージ単位、export 単位の「もう誰も使っていないかもしれないもの」だ。
こういうやつ。
- リファクタ後に残った
utils/old-parser.ts - 使わなくなったのに
package.jsonに残っている依存 - 昔は外から使っていたけど、今は誰も import していない exported function
- Story やテストだけが生き残って、本体側では参照されていないコンポーネント
こういう死蔵コードは、1個1個は小さい。
ただ、積もると「このファイル消していいんだっけ?」の判断コストとして効いてくる。
Knip が刺さるポイント
一番いいと思ったのは、見る単位がプロジェクト全体なところ。
ESLint はファイル内の未使用変数や未使用 import を見つけるのが得意だ。
一方で、ある export がプロジェクトのどこからも使われていないか、あるファイルがエントリポイントから辿られないか、package.json の依存が本当に必要か、みたいな話は別のレイヤーになる。
Knip はそこを見てくれる。
公式サイトでも、Knip は unused dependencies、exports、files を見つけて修正できるツールとして説明されている。さらに、フレームワークや周辺ツールの entry point を踏まえて解析するため、単純な grep より実用に寄っている。
特にいいなと思ったのは、プラグインの多さ。
執筆時点の公式ドキュメントでは、Next.js、Vitest、Jest、Storybook、Vite、Webpack、Nx、Remix、Svelte、GitHub Actions などを含む約150個のプラグインがあると紹介されていた。
この手のツールは「設定ファイルや CLI からだけ参照されるもの」を誤検知しがちだけど、主要ツールの慣習を知っているのはだいぶありがたい。
まずこれだけでいい
導入はかなり軽い。
npm init @knip/config
npm run knip
既存プロジェクトに入れず試すだけなら、次でもいける。
npx knip
Knip v6 は Node.js v20.19.0 以上、または Bun が必要とのこと。
Node.js のバージョンが古いプロジェクトでは、そこだけ先に確認したほうがいい。
出力が多すぎる場合は、まず件数を絞る。
npm run knip -- --max-show-issues 5
最初から全部直そうとすると疲れる。
まず「これは確実に消せる」というものだけ拾うのがよさそう。
消す前に見るポイント
Knip はかなり強いけど、レポートに出たものを脳死で全部消すのは危ない。
個人的には、次の順で見るのが扱いやすいと思った。
- 明らかに古いファイルを消す
- 未使用 dependencies を外す
- 未使用 exports を消す
--productionで本番コード目線の死蔵コードを見る- CI に入れるか考える
特に exports は注意したい。
アプリケーション内部の export なら消しやすいけど、ライブラリや公開 API の export は「このリポジトリ内では未使用」でも外部利用があるかもしれない。
なので、最初は internal なアプリや閉じたパッケージから始めるのがよさそう。
なぜ嬉しいのか
未使用コードを減らすメリットは、単に行数が減ることだけではない。
- grep 結果が汚れにくくなる
- リファクタ時に「これも直すべき?」で迷う量が減る
- 依存更新や脆弱性対応の対象が減る
- テストや Story だけ残っている亡霊を見つけやすくなる
- AI エージェントが古いコードを参考にして変な提案をする確率も下がる
最後のやつが地味に大きい。
AI にコードを書かせるほど、リポジトリ内に残った古い実装や未使用パターンがノイズになる。
人間にとっても AI にとっても、使われていないコードは「読めるけど信じていいかわからない情報」だ。
Knip はそこを掃除するきっかけをくれる。
まとめ
Knip、マジ神。
いまさら知ったけど、これはもっと使われていいと思う。
JavaScript / TypeScript のプロジェクトで、未使用ファイル、未使用依存、未使用 export が気になっているなら、とりあえず一回 npx knip してみる価値がある。
削除は慎重に。
でも、見える化は今すぐやっていい。