Skip to content

node_modules完全ガイド

node_modulesの構造と管理方法を、実務で使える実装例とベストプラクティスとともに詳しく解説します。

node_modulesは、プロジェクトで使用するパッケージがインストールされるディレクトリです。

node_modulesの構造
├─ パッケージの実体
├─ 依存関係の解決
└─ バージョン管理

問題のある構成(node_modulesなし):

// 問題: パッケージが利用できない
const express = require('express');
// Error: Cannot find module 'express'

解決: node_modulesによる依存関係の解決

Terminal window
# 解決: パッケージのインストール
npm install express
# node_modules/express/が作成される
# これにより、require('express')が動作する
node_modules/
├── express/
│ ├── node_modules/
│ │ ├── body-parser/
│ │ └── ...
│ └── package.json
├── cors/
│ └── package.json
└── ...

特徴:

  • 各パッケージが独自のnode_modulesを持つ
  • 依存関係がネストされる
  • ディスク使用量が多い
node_modules/
├── express/
├── body-parser/
├── cors/
└── ...

特徴:

  • すべてのパッケージがフラットに配置
  • 依存関係の解決が効率的
  • ディスク使用量が中程度

pnpmの構造(シンボリックリンク)

Section titled “pnpmの構造(シンボリックリンク)”
node_modules/
├── .pnpm/
│ ├── express@4.18.2/
│ └── ...
├── express -> .pnpm/express@4.18.2/node_modules/express
└── ...
~/.pnpm-store/
└── v3/
└── files/
└── ...

特徴:

  • シンボリックリンクを使用
  • グローバルストアからリンク
  • ディスク使用量が少ない

3. パッケージの解決メカニズム

Section titled “3. パッケージの解決メカニズム”

Node.jsのモジュール解決アルゴリズム

Section titled “Node.jsのモジュール解決アルゴリズム”
// 1. 現在のディレクトリのnode_modulesを確認
require('express')
// ./node_modules/express を探す
// 2. 親ディレクトリのnode_modulesを確認
// ../node_modules/express を探す
// 3. さらに親ディレクトリを確認
// ../../node_modules/express を探す
// 4. ルートディレクトリまで確認
// プロジェクト構造
project/
├── node_modules/
│ └── express/
├── src/
│ ├── node_modules/
│ │ └── local-package/
│ └── app.js
└── package.json
// src/app.js
const express = require('express');
// 1. src/node_modules/express を探す(見つからない)
// 2. project/node_modules/express を探す(見つかる)
# node_modulesはGitに含めない
node_modules/
# ロックファイルは含める(推奨)
package-lock.json
# または
yarn.lock
# または
pnpm-lock.yaml
Terminal window
# node_modulesの削除と再インストール
rm -rf node_modules
npm install
# または
rm -rf node_modules package-lock.json
npm install
Terminal window
# インストール済みパッケージの確認
npm list
# 依存関係のツリー表示
npm list --depth=0
# 未使用パッケージの確認
npx depcheck

5. 実務でのベストプラクティス

Section titled “5. 実務でのベストプラクティス”

パターン1: ロックファイルの管理

Section titled “パターン1: ロックファイルの管理”
Terminal window
# package-lock.jsonをGitに含める(推奨)
git add package-lock.json
# 理由:
# 1. 再現性の確保
# 2. チーム間の一貫性
# 3. CI/CDでの再現性

パターン2: node_modulesのサイズ管理

Section titled “パターン2: node_modulesのサイズ管理”
Terminal window
# node_modulesのサイズ確認
du -sh node_modules
# 大きなパッケージの特定
npx bundle-phobia express
# 代替パッケージの検討
# 例: moment.js → date-fns
Terminal window
# 重複パッケージの削除
npm dedupe
# 未使用パッケージの削除
npx depcheck
npx npm-check-updates
# パッケージの更新
npm update

原因:

  • 不要なパッケージがインストールされている
  • 依存関係が重複している

解決策:

Terminal window
# 未使用パッケージの確認
npx depcheck
# 重複パッケージの削除
npm dedupe
# pnpmへの移行を検討
npm install -g pnpm
pnpm install

問題2: パッケージが見つからない

Section titled “問題2: パッケージが見つからない”

原因:

  • node_modulesが削除されている
  • パッケージがインストールされていない

解決策:

Terminal window
# 再インストール
npm install
# 特定のパッケージの再インストール
npm install express
# キャッシュのクリア
npm cache clean --force
npm install

原因:

  • package-lock.jsonが更新されていない
  • 異なる環境でインストール

解決策:

Terminal window
# package-lock.jsonの再生成
rm package-lock.json
npm install
# バージョンの確認
npm list express

これで、node_modulesの基礎知識と実務での使い方を理解できるようになりました。