記事一覧に戻る

いまさら Knip を知った。未使用コード削減がめちゃくちゃ捗る

JavaScript / TypeScript プロジェクトの未使用ファイル、依存、export をまとめて見つける Knip を試して、これはもっと使われてほしいと思ったメモ。

2026年5月26日1 min read
Knip
TypeScript
JavaScript
Tooling

この記事を共有

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 はかなり強いけど、レポートに出たものを脳死で全部消すのは危ない。

個人的には、次の順で見るのが扱いやすいと思った。

  1. 明らかに古いファイルを消す
  2. 未使用 dependencies を外す
  3. 未使用 exports を消す
  4. --production で本番コード目線の死蔵コードを見る
  5. CI に入れるか考える

特に exports は注意したい。
アプリケーション内部の export なら消しやすいけど、ライブラリや公開 API の export は「このリポジトリ内では未使用」でも外部利用があるかもしれない。

なので、最初は internal なアプリや閉じたパッケージから始めるのがよさそう。

なぜ嬉しいのか

未使用コードを減らすメリットは、単に行数が減ることだけではない。

  • grep 結果が汚れにくくなる
  • リファクタ時に「これも直すべき?」で迷う量が減る
  • 依存更新や脆弱性対応の対象が減る
  • テストや Story だけ残っている亡霊を見つけやすくなる
  • AI エージェントが古いコードを参考にして変な提案をする確率も下がる

最後のやつが地味に大きい。
AI にコードを書かせるほど、リポジトリ内に残った古い実装や未使用パターンがノイズになる。

人間にとっても AI にとっても、使われていないコードは「読めるけど信じていいかわからない情報」だ。
Knip はそこを掃除するきっかけをくれる。

まとめ

Knip、マジ神。

いまさら知ったけど、これはもっと使われていいと思う。
JavaScript / TypeScript のプロジェクトで、未使用ファイル、未使用依存、未使用 export が気になっているなら、とりあえず一回 npx knip してみる価値がある。

削除は慎重に。
でも、見える化は今すぐやっていい。

参考