npm install を実行して赤いエラーメッセージの壁に直面するのは、すべての JavaScript 開発者が通る道です。macOS でのパーミッションエラー、monorepo での依存関係の競合、CI でのキャッシュ破損など、原因がわかれば修正は通常簡単です。このガイドではよくある npm install エラーすべてを網羅し、原因を説明し、修正コマンドを提供します。
エラー辞書:クイックリファレンス
| エラーコード | 意味 | クイックフィックス |
|---|---|---|
| EACCES | パーミッション拒否 — npm が所有権のないディレクトリに書き込もうとした。 | nvm を使用するか、ディレクトリの所有権を修正(下記参照)。 |
| ENOENT | ファイルまたはディレクトリが見つからない。 | node_modules と package-lock.json を削除して再インストール。 |
| EPERM | 操作が許可されていない — Windows でのファイルロック問題が多い。 | フォルダをロックしているエディタ/ターミナルを閉じて再試行。 |
| ERESOLVE | 依存関係の競合 — 2つのパッケージが互換性のない peer 依存関係を要求。 | --legacy-peer-deps または --force を使用(下記参照)。 |
| ERR_SOCKET_TIMEOUT | ネットワークタイムアウト — npm がレジストリに接続できない。 | ネットワーク/プロキシ設定を確認、またはミラーレジストリに切り替え。 |
| code 1 | ライフサイクルスクリプト(preinstall, postinstall)がエラーコード 1 で終了。 | ビルドツール(Python、node-gyp、C++ コンパイラ)がインストールされているか確認。 |
EACCES:パーミッションエラーの修正
macOS と Linux で最もよくあるエラーです。npm がグローバルパッケージを /usr/local/lib/node_modules のようなシステムディレクトリにインストールしようとすると発生します。
macOS / Linux での修正(推奨:nvm を使用)
最善の恒久的な修正は Node バージョンマネージャーを使用することです。npm がホームディレクトリにインストールされます:
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
# Restart terminal, then install Node
nvm install --lts
nvm use --lts
# Verify — npm now installs to ~/.nvm/
which npm
# /home/youruser/.nvm/versions/node/v20.x.x/bin/npm代替手段:npm のデフォルトディレクトリを手動で変更:
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
# Add to ~/.bashrc or ~/.zshrc:
export PATH=~/.npm-global/bin:$PATH
# Reload shell
source ~/.bashrc最終手段(ほとんどのユーザーには非推奨):
# NOT recommended — changes system directory ownership
sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/shareWindows での修正
Windows では管理者としてターミナルを実行するか、nvm-windows を使用:
# Install nvm-windows from:
# https://github.com/coreybutler/nvm-windows/releases
# Then in an elevated (Admin) PowerShell:
nvm install lts
nvm use lts
# Or fix npm prefix for current user:
npm config set prefix %APPDATA%\npmERESOLVE:依存関係の競合を修正
npm 7 以降、peer 依存関係の競合はデフォルトでインストールを失敗させます。競合するパッケージを示すツリー図が表示されます。
典型的なエラー出力:
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @some-org/some-package@2.1.0
npm ERR! Found: react@18.2.0
npm ERR! node_modules/react
npm ERR! react@"^18.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0 || ^17.0.0" from some-library@3.5.0
npm ERR! node_modules/some-library
npm ERR! some-library@"^3.5.0" from the root project--legacy-peer-deps と --force の違い
--legacy-peer-deps は npm に peer 依存関係の競合を完全に無視するよう指示します(npm 6 と同じ動作)。--force は競合に関係なくインストールを強制します。使い分け:
| Flag | When to Use |
|---|---|
| --legacy-peer-deps | peer dep の不一致が無害だとわかっている場合(例:React 18 vs 17)。 |
| --force | キャッシュコピーがあっても再取得し、競合を上書きしたい場合。 |
# Option 1: Ignore peer deps (safest workaround)
npm install --legacy-peer-deps
# Option 2: Force install (overrides everything)
npm install --force推奨アプローチ — 競合する依存関係をピン留め:
// In package.json — add "overrides" to pin the conflicting dep
{
"overrides": {
"some-library": {
"react": "^18.2.0"
}
}
}
// Then run:
// npm installnode_modules の破損:いつ・どのように削除して再インストールするか
node_modules は時々異常な状態になります。package.json にあるパッケージの "Cannot find module" エラーや、ブランチ切り替え後の奇妙なビルド失敗が症状です。
node_modules を削除すべきタイミング
- 異なる依存関係ツリーのブランチに切り替えた後。
- package-lock.json のマージコンフリクトを解決した後。
- 明らかにインストール済みのパッケージで "Module not found" が出る場合。
- Node.js をメジャーバージョンにアップグレードした後。
クリーンインストールの方法
クロスプラットフォームワンライナー(bash):
rm -rf node_modules package-lock.json
npm installWindows(PowerShell):
Remove-Item -Recurse -Force node_modules
Remove-Item package-lock.json
npm installnpx を使った便利な方法:
npx rimraf node_modules
npm install問題が解決しない場合は npm キャッシュもクリア:
npm cache clean --force
rm -rf node_modules package-lock.json
npm installpackage-lock.json の競合:マージ戦略
複数の開発者が依存関係を変更すると、package-lock.json のマージコンフリクトはほぼ確実に発生します。手動で解決しようとしないでください — このファイルは機械生成です。
推奨マージ戦略
競合のどちらか一方を受け入れる(どちらでも良い):
# Accept "theirs" (the incoming branch's version)
git checkout --theirs package-lock.json
git add package-lock.json
# OR accept "ours" (your branch's version)
git checkout --ours package-lock.json
git add package-lock.jsonロックファイルを再生成:
npm install結果をコミット:
git add package-lock.json
git commit -m "chore: regenerate package-lock.json after merge".gitattributes でコンフリクトを防止
.gitattributes に以下を追加してロックファイルのコンフリクトを自動解決:
# .gitattributes
package-lock.json merge=oursNode.js バージョンの非互換性
多くのパッケージは特定の Node.js バージョンを必要とします。Node バージョンが古すぎる(または新しすぎる)と、コンパイルエラーやエンジン警告で npm install が失敗する可能性があります。
必要なバージョンの確認
package.json の engines フィールドを確認:
// package.json
{
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
}
}
// Check your current version:
// node -v
// npm -vnvm または fnm でバージョンを切り替え
nvm(Node Version Manager):
# List available versions
nvm ls-remote
# Install a specific version
nvm install 20
# Switch to a version
nvm use 20
# Set a default
nvm alias default 20fnm(Fast Node Manager)— より高速な代替手段:
# Install fnm (Rust-based, faster than nvm)
curl -fsSL https://fnm.vercel.app/install | bash
# Install and use a version
fnm install 20
fnm use 20
fnm default 20プロジェクトルートに .nvmrc ファイルを作成してチーム全体で同じバージョンを使用:
# Create .nvmrc file
echo "20" > .nvmrc
# Team members just run:
nvm use
# or
fnm useCI/CD の問題:Docker ビルドと GitHub Actions
npm install は CI 環境では動作が異なります。キャッシュ、パーミッション、ネットワーク設定すべてに注意が必要です。
Docker ビルド
Dockerfile でよくある間違い:
# BAD Dockerfile — no layer caching, uses npm install
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
# GOOD Dockerfile — proper layer caching, uses npm ci
FROM node:20-alpine
WORKDIR /app
# Copy package files first (layer caching!)
COPY package.json package-lock.json ./
# Use npm ci for deterministic installs
RUN npm ci --ignore-scripts
# Then copy the rest of the source
COPY . .
# Run any build steps after copy
RUN npm run build
CMD ["node", "index.js"]ポイント:レイヤーキャッシュのためにまず package ファイルをコピー、CI では npm install の代わりに npm ci を使用(高速で決定的)、postinstall スクリプトが不要なら --ignore-scripts を使用。
GitHub Actions キャッシュ
適切なキャッシュでインストール時間を 70% 以上短縮できます:
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm' # Caches ~/.npm automatically
- run: npm ci # Deterministic install
- run: npm test
- run: npm run build決定フローチャート:npm install 失敗時のガイド
このフローチャートで npm install の失敗を診断してください:
1. パーミッションエラー(EACCES / EPERM)ですか?
はい -> nvm を使用するか、ディレクトリの所有権を修正。
2. 依存関係の競合(ERESOLVE)ですか?
はい -> まず --legacy-peer-deps を試し、次にバージョン固定を確認。
3. ネットワークエラー(SOCKET_TIMEOUT / FETCH)ですか?
はい -> プロキシ、VPN を確認、またはレジストリをミラーに切り替え。
4. ビルド/コンパイルエラー(node-gyp / code 1)ですか?
はい -> ビルドツール(python3, make, g++ / Visual Studio Build Tools)をインストール。
5. "Cannot find module" または異常な動作ですか?
はい -> node_modules + package-lock.json を削除して npm install。
6. まだ失敗しますか?
はい -> npm キャッシュをクリア(npm cache clean --force)、Node バージョンを確認、新規クローンを試行。
よくある質問
Mac で "npm ERR! EACCES: permission denied" を修正するには?
最善の修正は nvm(Node Version Manager)経由で Node.js をインストールすることです。ホームディレクトリにインストールされ、パーミッションの問題を完全に回避できます。実行:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash、その後 nvm install --lts。または npm グローバルディレクトリを変更:mkdir ~/.npm-global && npm config set prefix ~/.npm-global を PATH に追加。
"npm ERR! ERESOLVE could not resolve" とは?
ERESOLVE は依存関係ツリー内の2つ以上のパッケージが同じ peer 依存関係の異なる非互換バージョンを要求していることを意味します。npm 7 以降ではこれはハードエラーです。npm install コマンドに --legacy-peer-deps を追加するか、package.json の overrides フィールドで互換バージョンを手動で固定して修正できます。
npm install エラーを修正するために package-lock.json を削除すべき?
package-lock.json の削除は最終手段であるべきで、最初のステップではありません。ロックファイルは決定的なインストールを保証します。まず node_modules のみ削除して npm install を実行。失敗した場合、node_modules と package-lock.json の両方を削除。再生成されたロックファイルは必ずコミットしてください。
なぜ Docker で npm install が失敗するのにローカルでは動く?
一般的な原因:root で実行しているが --unsafe-perm なし、Docker イメージにネイティブビルドツール(python3, make, g++)がない、COPY 順序によるレイヤーキャッシュの問題、.dockerignore が node_modules を除外していない。Docker では決定的なビルドのために npm ci を使用してください。
npm install 中の "npm ERR! code 1" を修正するには?
エラーコード 1 は通常 postinstall スクリプトの失敗、多くはネイティブモジュールコンパイル(node-gyp)を意味します。macOS:xcode-select --install。Ubuntu/Debian:sudo apt install build-essential python3。Windows:npm install -g windows-build-tools または Visual Studio Build Tools をインストール。
npm install と npm ci の違いは?
npm install は package.json を読み、package-lock.json を更新する可能性があります。npm ci(クリーンインストール)は node_modules を削除し、package-lock.json のみ読み、正確なバージョンをインストールします。CI/CD パイプラインと Docker ビルドでは npm ci を、ローカル開発では npm install を使用してください。