開発者向け

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

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

約8分で読めますMoreRoomチーム(Yando Pte. Ltd.)このページをMarkdownで見る

要点

  • 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といったビルド用フォルダも自動的に作り直されるため、削除して問題ありません。

Macでnode_modulesフォルダを見つけて整理する方法

  1. node_modulesフォルダをサイズ付きで一覧表示する. ~/Libraryとゴミ箱を除外し、最上位のnode_modulesごとに検索を止め、結果をdu -shに渡すfindコマンドをホームフォルダに対して実行します。
  2. 作業していないプロジェクトを選ぶ. 各プロジェクトに、package.jsonと、package-lock.json、pnpm-lock.yaml、yarn.lock、bun.lockなどのlockファイルがあることを確認します。これらのファイルは残します。
  3. そのnode_modulesフォルダを削除する. Finderで各node_modulesフォルダをゴミ箱に入れるか、npx npkillで対話的に削除します(npkillは完全に削除します)。
  4. パッケージマネージャのキャッシュを消去する. 使っているパッケージマネージャに応じて、npm cache clean --force、pnpm store prune、yarn cache clean、bun pm cache rmを実行します。
  5. プロジェクトに戻るときに再インストールする. プロジェクトフォルダでnpm ci、pnpm install、yarn install、bun installのいずれかを実行し、lockファイルからnode_modulesを復元します。

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

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

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

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をゴミ箱にドラッグすることです。ゴミ箱を空にするまでは、いつでも考え直せます。小さなファイルが大量にあるため、ゴミ箱への移動には少し時間がかかります。

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

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

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

npkill:対話的に削除する方法

npkillは、node_modulesフォルダをサイズ付きで一覧表示し、キー操作1回ずつで削除できるツールです:

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

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

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

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

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

npm cache clean --force
pnpm store prune
yarn cache clean
bun pm cache rm
  • npmはキャッシュを~/.npm/_cacacheに保存します。npmのcacheのドキュメントでは、cleanに--forceが必要な理由と、npm cache verifyならすべてを空にせずに不要なデータだけを整理できることが説明されています。npxで取得したパッケージは~/.npm/_npxにあります。
  • pnpmは、macOSではストアを~/Library/pnpm/storeに置きます(pnpm store pathで実際の場所を確認できます)。pnpm store pruneは、どのプロジェクトからも参照されていないパッケージだけを削除します。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は、各パッケージをコンテンツアドレス方式のストアに1回だけ保存し、そのファイルを使用するすべてのプロジェクトにリンクします。macOSでは、pnpmのデフォルトのpackageImportMethodは、まずAPFSクローンを試し、次にハードリンクを使います。

npmはパッケージを各プロジェクトにコピーし、pnpmはクローンまたはハードリンクで1つのストアを共有する仕組みの図

いずれの場合も、データ自体は共有されています。それでも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にはコレクターと目標モードも含まれます。

よくある質問

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を使ってください。

このガイドに登場するフォルダ