DevToolBoxFREE
BlogAdvertise

npm installエラー大全:全エラーの原因と解決方法

12分by DevToolBox

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/share

Windows での修正

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%\npm

ERESOLVE:依存関係の競合を修正

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 は競合に関係なくインストールを強制します。使い分け:

FlagWhen to Use
--legacy-peer-depspeer 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 install

node_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 install

Windows(PowerShell):

Remove-Item -Recurse -Force node_modules
Remove-Item package-lock.json
npm install

npx を使った便利な方法:

npx rimraf node_modules
npm install

問題が解決しない場合は npm キャッシュもクリア:

npm cache clean --force
rm -rf node_modules package-lock.json
npm install

package-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=ours

Node.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 -v

nvm または 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 20

fnm(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 use

CI/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 を使用してください。

𝕏 Twitterin LinkedIn
この記事は役に立ちましたか?

Stay Updated

Get weekly dev tips and new tool announcements.

No spam. Unsubscribe anytime.

Partner Picks

Sponsor this article

Place your product next to this developer topic with tracked clicks.

Ask about article sponsorship

This site uses cookies for analytics and to display ads. By continuing to browse, you agree. Privacy Policy