knip で未使用のファイル・依存・export を一掃する

目次
プロジェクトが育つと、使われていないファイル・依存パッケージ・export が静かに溜まっていきます。knip はそれらをまとめて検出してくれるツールです。本記事では導入から設定、CI 連携までを紹介します。
knip とは
JavaScript / TypeScript プロジェクトの「不要なもの」を横断的に見つける静的解析ツールです。ESLint が「1ファイルの書き方」を見るのに対し、knip は プロジェクト全体で誰からも使われていないもの を検出します。
検出できる主なもの:
- 使われていないファイル
- 使われていない依存パッケージ(dependencies / devDependencies)
package.jsonに記載が無い依存(unlisted dependencies)- 使われていない export / 型 export
- 重複した export
インストール
pnpm add -D knipknip は tsconfig.json やフレームワーク(Next.js など)を自動検出するため、多くのプロジェクトでは設定ゼロでも動きます。
実行する
pnpm knip未使用のものがあると、種類ごとに一覧で出力されます。
Unused files (2)
src/lib/old-helper.ts
src/components/legacy-banner.tsx
Unused dependencies (1)
lodash package.json
Unused exports (1)
formatLegacyDate unknown src/lib/format.ts:42:14設定する(knip.json)
エントリーポイントと解析範囲を明示したい場合は knip.json を置きます。多くのフレームワークはプラグインで自動認識されますが、明示するとより正確になります。
{
"entry": ["src/app/**/*.{ts,tsx}", "next.config.ts"],
"project": ["src/**/*.{ts,tsx}"]
}entry… 「ここから辿れれば使用中」とみなす起点project… 解析対象のファイル群
よく使うオプション
| オプション | 効果 |
|---|---|
--production |
本番コードのみ対象(テストや devDependencies を除外) |
--fix |
未使用の export やファイルを自動で取り除く |
--reporter json |
JSON で出力(CI 連携向け) |
--fix は便利ですが、削除内容を必ず差分で確認してからコミットしましょう。
CI に組み込む
package.json にスクリプトを足し、CI で実行して未使用を検出したら落とす運用にできます。
{
"scripts": {
"knip": "knip"
}
}# GitHub Actions の一例
- run: pnpm install --frozen-lockfile
- run: pnpm knip最初は誤検出(false positive)が出ることもあります。その場合は knip.json の ignore や ignoreDependencies で調整します。
{
"ignore": ["src/generated/**"],
"ignoreDependencies": ["some-peer-only-package"]
}まとめ
knip は「プロジェクトに溜まった不要物」の棚卸しに効きます。導入は数分、最初の実行だけでも驚くほど削れることが多いです。定期的に回す、あるいは CI に組み込んで、コードベースを軽く保ちましょう。
関連記事

デプロイ先の環境をブランチで出し分けるとき、secret を FOO_STG / FOO_PROD のように別名で用意して if 分岐する必要はありません。job の environment をブランチから動的に決めれば、Environment secret として「同じ名前」の secret を各環境に置くだけで自動的に出し分けられます。三項演算子っぽい書き方の仕組みと注意点、承認レビューの掛け方まで解説します。

GitHub の Repository ruleset を使って develop / main への直接 push を止め、Pull Request 経由を強制する設定を、個人〜少人数開発の視点でまとめます。Require a pull request before merging が本命であること、Required approvals 0 でも直接 push は禁止できること、Restrict updates を選んではいけない落とし穴、Bypass list の扱い、CI 必須化まで解説します。

Terraform の S3 backend が要求する state バケットを、GitHub Actions の OIDC + IAM ロールで手動ワークフローから作成する手順。backend の鶏卵問題、最小権限ロール、冪等な bootstrap、そして role-to-assume が空になるハマりどころまで解説します。