# あちこちにあるnode_modules：見つけ方、整理の仕方、元に戻し方

> Mac上のnode_modulesフォルダをサイズ付きですべて見つけ、不要なものを削除し、lockファイルから再インストールし、パッケージマネージャのキャッシュを消去する方法。

- URL: https://moreroom.app/ja/learn/node-modules-cleanup
- Published: 2026-10-17
- Updated: 2026-10-17
- Publisher: MoreRoom (Yando Pte. Ltd.) — https://moreroom.app

## TL;DR

- package.jsonとlockファイルさえ残しておけば、node_modulesは削除しても安全です。npm ciやpnpm installで、まったく同じバージョンが戻ってきます。
- -prune付きのfindを使えば、入れ子のフォルダまで潜らずに、ホームフォルダ内のすべてのnode_modulesフォルダをサイズ付きで一覧表示できます。
- npx npkillでは、node_modulesフォルダを見ながら対話的に削除できます。ただし、ゴミ箱を経由せずにすぐ削除されます。
- pnpmでは、node_modules内のファイルは共有ストアのクローンまたはハードリンクなので、pnpm store pruneを実行するまでほとんど容量は空きません。
- .next、.turbo、.nuxt、.svelte-kit、.parcel-cacheといったビルド用フォルダも自動的に作り直されるため、削除して問題ありません。

[node_modules](https://moreroom.app/glossary#node-modules)フォルダには、1つのJavaScriptまたはTypeScriptプロジェクトにインストールされた依存関係が入っており、一般的なサイズは数百MBです。古いプロジェクトが何十もあれば、合計で数十GBになるのも珍しくありません。**`package.json`とlockファイルさえ残しておけば、削除しても安全です**。プロジェクトに戻ったとき、パッケージマネージャが同じバージョンを再インストールしてくれます。

## すべてのnode_modulesフォルダとそのサイズを調べる

次のコマンドは、`~/Library`とゴミ箱を除外してホームフォルダを検索し、各`node_modules`フォルダをサイズ付きで、大きいものが最後になるように表示します：

```sh
find ~ \( -path "$HOME/Library" -o -path "$HOME/.Trash" \) -prune -o -type d -name node_modules -prune -print0 2>/dev/null | xargs -0 du -sh 2>/dev/null | sort -h
```

仕組みは次のとおりです。最初の`-prune`で2つの除外フォルダを飛ばし、`-type d -name node_modules`で対象のフォルダに一致させ、2つ目の`-prune`で`find`がその中に潜らないようにします。これにより、入れ子になった`node_modules`は親フォルダの中で1回だけ数えられます。`du -sh`が各フォルダのサイズを測り、`sort -h`で並べ替えます。読み取るだけのコマンドです。ホームフォルダが大きいと数分かかることがあり、ターミナルが「書類」「デスクトップ」「ダウンロード」へのアクセスを求めることがあります。

`~/.nvm`、`~/.vscode`、`~/.cursor`といったツールのフォルダ内の結果は無視してください。それらはプロジェクトではなく、インストールしたツールやエディタ拡張機能のものです。

プロジェクトでpnpmを使っている場合、表示されるサイズは実際に取り戻せる容量より大きくなります。その理由は後半で説明します。

## 不要なものを削除する

削除する前にプロジェクトフォルダを開き、lockファイルがあることを確認します：`package-lock.json`（npm）、`pnpm-lock.yaml`（pnpm）、`yarn.lock`（Yarn）、`bun.lock`／`bun.lockb`（Bun）。lockファイルと`package.json`は残してください。

最も安全な削除方法は、Finderで`node_modules`をゴミ箱にドラッグすることです。ゴミ箱を空にするまでは、いつでも考え直せます。小さなファイルが大量にあるため、ゴミ箱への移動には少し時間がかかります。

ターミナルで、プロジェクトフォルダの中から削除する場合：

```sh
cd ~/Projects/old-app
rm -rf node_modules
```

`rm -rf`はゴミ箱を経由せずに完全に削除します。先に`pwd`で今いるフォルダを確認し、ワイルドカードや空の変数を使って実行することは絶対に避けてください。

### npkill：対話的に削除する方法

[npkill](https://github.com/voidcosmos/npkill)は、`node_modules`フォルダをサイズ付きで一覧表示し、キー操作1回ずつで削除できるツールです：

```sh
npx npkill -d ~/Projects
```

`-d`で検索を始める場所を指定します。指定しない場合は、現在のフォルダから検索します。矢印キーで移動し、SpaceキーかDelキーで選択したフォルダを削除します。npkillはゴミ箱を経由せず、すぐに削除します。アプリの実行に必要なフォルダには⚠️が付くので、それらには手を付けないでください。先に試したい場合は、`--dry-run`で削除をシミュレートできます。

## プロジェクトに戻るときに再インストールする

lockファイルの記録どおりにインストールするコマンドを使います：

| パッケージマネージャ | lockファイル | 再インストール |
|---|---|---|
| npm | `package-lock.json` | `npm ci` |
| pnpm | `pnpm-lock.yaml` | `pnpm install --frozen-lockfile` |
| Yarn（Berry） | `yarn.lock` | `yarn install --immutable` |
| Yarn Classic | `yarn.lock` | `yarn install --frozen-lockfile` |
| Bun | `bun.lock` | `bun install --frozen-lockfile` |

[`npm ci`](https://docs.npmjs.com/cli/v11/commands/npm-ci)はlockファイルが必須で、既存の`node_modules`を先に削除し、`package.json`やlockファイルを変更することはありません。通常の`npm install`でも構いませんが、lockファイルが更新される場合があります。

## 自動的に作り直されるほかのフォルダ

フレームワークやビルドツールは、`node_modules`の隣にキャッシュや出力を保存します。実行していないプロジェクトであれば、これらは削除しても安全です。次回のビルドや開発サーバの起動時に作り直されます。

| フォルダ | 作成元 |
|---|---|
| `.next` | Next.js |
| `.nuxt` | Nuxt |
| `.svelte-kit` | SvelteKit |
| `.turbo` | Turborepo |
| `.parcel-cache` | Parcel |
| `.angular` | Angular CLI |

`dist`と`build`も通常はビルド出力ですが、名前が汎用的です。そこにファイルをコミットしていたり、別の用途に使っていたりするプロジェクトもあるため、削除する前に中身を確認してください。

プロジェクトフォルダ内のフレームワークのキャッシュを一覧表示するには：

```sh
find ~/Projects -type d \( -name .next -o -name .nuxt -o -name .svelte-kit -o -name .turbo -o -name .parcel-cache \) -prune -print0 | xargs -0 du -sh | sort -h
```

## グローバルなパッケージキャッシュを消去する

各パッケージマネージャは、すべてのプロジェクトで共有するダウンロードキャッシュも持っています。消去は元に戻せませんが、害はありません。必要になれば、パッケージは再ダウンロードされます。

```sh
npm cache clean --force
pnpm store prune
yarn cache clean
bun pm cache rm
```

- **npm**はキャッシュを`~/.npm/_cacache`に保存します。[npmのcacheのドキュメント](https://docs.npmjs.com/cli/v11/commands/npm-cache)では、`clean`に`--force`が必要な理由と、`npm cache verify`ならすべてを空にせずに不要なデータだけを整理できることが説明されています。`npx`で取得したパッケージは`~/.npm/_npx`にあります。
- **pnpm**は、macOSではストアを`~/Library/pnpm/store`に置きます（`pnpm store path`で実際の場所を確認できます）。[`pnpm store prune`](https://pnpm.io/cli/store)は、どのプロジェクトからも参照されていないパッケージだけを削除します。pnpmのドキュメントでは、頻繁にではなく、ときどき実行することが勧められています。
- **Yarn Classic**は`~/Library/Caches/Yarn`にキャッシュします。Yarn Berryでは、`yarn cache clean --mirror`で`~/.yarn/berry/cache`のグローバルキャッシュを空にできます。
- **Bun**は`~/.bun/install/cache`にキャッシュし、`bun pm cache rm`で空にできます。

nvmでインストールした古いNode.jsも`~/.nvm/versions/node`にたまっていきます。不要になったバージョンは`nvm uninstall <version>`で削除できます。

## pnpmで、duの表示ほど容量が空かない理由

npmとYarn Classicは、すべてのパッケージを各プロジェクトの`node_modules`にコピーします。pnpmは、各パッケージを[コンテンツアドレス方式のストア](https://pnpm.io/motivation)に1回だけ保存し、そのファイルを使用するすべてのプロジェクトにリンクします。macOSでは、pnpmのデフォルトの[`packageImportMethod`](https://pnpm.io/settings/node-modules)は、まずAPFSクローンを試し、次に[ハードリンク](https://moreroom.app/glossary#hard-link)を使います。

![npmはパッケージを各プロジェクトにコピーし、pnpmはクローンまたはハードリンクで1つのストアを共有する仕組みの図](https://moreroom.app/learn/img/node-modules-cleanup-pnpm-store.svg)

いずれの場合も、データ自体は共有されています。それでも`du`は各プロジェクトでフルサイズを数えるため、pnpmプロジェクトの`node_modules`を削除しても、通常は表示されていたよりずっと少ない容量しか空きません。容量が戻るのは、残っているどのプロジェクトも使っていないパッケージを`pnpm store prune`が削除したときです。これが機能するには、ストアがプロジェクトと同じディスク上にある必要があります。外部ドライブ上のプロジェクトは、そのドライブに独自のストアを持ちます。

## MoreRoomでできること

MoreRoomの無料版は、lockファイルがあり30日間変更されていないプロジェクトの`node_modules`フォルダと、`.next`や`.turbo`といったフレームワークのキャッシュを見つけ、「安全に削除可能」のラベルを付けます。`~/Library`や、`~/.nvm`、`~/.vscode`などのツールのフォルダは対象外です。項目は1つずつゴミ箱に入れられ、取り消しもできます。npmのキャッシュとpnpmのストアについては、MoreRoomが`npm cache clean --force`と`pnpm store prune`を実行します。これらのコマンドは元に戻せないため、その旨が表示されます。

MoreRoom Proではプロジェクトの休止が使えます。使っていないプロジェクトから`node_modules`やビルド出力など再作成できるフォルダを取り除き、作業に戻るときはクリックひとつで再開できます。Proにはコレクターと目標モードも含まれます。

## FAQ

### node_modulesは削除しても安全ですか？

はい。中身はインストールされた依存関係だけで、パッケージマネージャがpackage.jsonとlockファイルから再インストールできます。削除するのは今実行していないプロジェクトだけにして、lockファイルは残してください。

### package-lock.jsonも削除したほうがいいですか？

いいえ。lockファイルには、動作が確認された正確なバージョンが記録されています。あとでnpm ci、pnpm install、yarn installで同じnode_modulesを再現できるよう、残しておいてください。

### pnpmのプロジェクトでnode_modulesを削除しても、ほとんど容量が空かないのはなぜですか？

pnpmは各パッケージのコピーを共有ストアに1つだけ置き、そのファイルを各プロジェクトにクローンまたはハードリンクしています。プロジェクトのnode_modulesを削除しても消えるのはリンクだけで、pnpm store pruneを実行すると、どのプロジェクトも使っていないパッケージが削除されます。

### npm cache clean --forceは安全ですか？

はい。~/.npm/_cacache内のnpmのダウンロードキャッシュを空にするだけで、必要になればnpmがパッケージを再ダウンロードします。npmのドキュメントでも、キャッシュの消去が役立つのはディスク容量を取り戻すときだけだと説明されています。

### npkillはフォルダをゴミ箱に入れますか？

いいえ。npkillは選択したフォルダをすぐに削除します。試しに動かすなら--dry-runオプションを、ゴミ箱を安全網として使いたいならFinderを使ってください。
