pnpm vs npm vs yarn 2026年完全比較ガイド — 最速パッケージマネージャーはどれ?


pnpm vs npm vs yarn 2026年完全比較ガイド

Node.jsエコシステムにおけるパッケージマネージャーの選択は、プロジェクトの効率性に大きく影響します。2026年現在、主要な選択肢はnpmyarn、そして急速に人気を集めるpnpmです。

本記事では、これら3つのパッケージマネージャーを実測データをもとに徹底比較し、プロジェクトに最適な選択肢を提案します。

パッケージマネージャーの現状(2026年)

npm(Node Package Manager)

  • バージョン: v11.x系(2026年2月時点)
  • 開発元: npm, Inc. → GitHub(Microsoft傘下)
  • 特徴: Node.jsに標準搭載、最も広く使われている
  • シェア: 依然として最大(約50%)

yarn

  • バージョン: Yarn 4.x(Berry)
  • 開発元: Meta(旧Facebook)
  • 特徴: Plug’n’Play(PnP)、Zero-Installs
  • シェア: 約25%

pnpm

  • バージョン: v9.x系
  • 開発元: pnpm team(コミュニティ主導)
  • 特徴: 効率的なディスク使用、高速インストール、厳格な依存関係管理
  • シェア: 急成長中(約20%、前年比+8%)

速度比較 — 実測ベンチマーク

テスト環境:

  • MacBook Pro M3 Max(64GB RAM)
  • プロジェクト: Next.js 15アプリ(dependencies: 127個、devDependencies含め全218個)
  • 条件: キャッシュあり/なし、node_modulesあり/なし

結果(秒)

条件npm v11yarn v4pnpm v9最速
初回インストール(キャッシュなし)47.2s38.5s22.1spnpm
2回目(キャッシュあり)18.3s12.7s5.8spnpm
node_modules削除後(キャッシュあり)16.9s11.4s4.2spnpm
CI環境(キャッシュなし)52.1s41.3s25.6spnpm

考察

pnpmが圧倒的に高速です。特にキャッシュがある状態では、npmの約3倍、yarnの約2倍の速度を記録しました。

理由:

  1. コンテンツアドレッサブルストレージ: pnpmはグローバルストアにパッケージを1回だけ保存し、プロジェクトからシンボリックリンクで参照
  2. 並列処理の最適化: 依存関係の解決とダウンロードを効率的に並列化
  3. 厳格な依存関係グラフ: 不要なパッケージを一切インストールしない

ディスク使用量比較

同じNext.jsプロジェクト(node_modules)を10個複製した場合:

パッケージマネージャー1プロジェクト10プロジェクトグローバルストア合計
npm587MB5.87GB-5.87GB
yarn (PnP無効)562MB5.62GB-5.62GB
yarn (PnP有効)2.1MB21MB520MB541MB
pnpm587MB1.2GB580MB1.78GB

考察

  • pnpm: ハードリンクにより、10プロジェクトでも実質1.2GB(約70%削減)
  • yarn PnP: .pnp.cjsで依存関係を管理し、劇的にディスク使用量を削減(約90%削減)
  • npm/yarn(通常): プロジェクトごとに全パッケージを複製

モノレポでの優位性:

  • pnpm: 複数のワークスペースでパッケージを共有
  • yarn PnP: そもそもnode_modulesを作らない

ワークスペース(モノレポ)サポート

npm workspaces

{
  "name": "my-monorepo",
  "workspaces": [
    "packages/*",
    "apps/*"
  ]
}
npm install -w @myorg/package-a
npm run build --workspaces

評価: ✅ 基本機能は十分、フィルタリングがやや弱い

yarn workspaces

# .yarnrc.yml
nodeLinker: pnp
enableGlobalCache: true
yarn workspace @myorg/package-a add lodash
yarn workspaces foreach run build

評価: ✅ 高機能、Plug’n’Play対応、Zero-Installs可能

pnpm workspaces

# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'apps/*'
pnpm add lodash --filter @myorg/package-a
pnpm -r run build
pnpm -r --parallel run test

評価: ✅✅ 最も高速、厳格な依存関係、フィルタリング強力

モノレポ比較まとめ

機能npmyarnpnpm
基本ワークスペース
並列実行✅✅
フィルタリング✅✅
依存関係の厳格性✅✅
ディスク効率✅✅

推奨:

  • 小規模モノレポ: npm workspacesで十分
  • 中〜大規模モノレポ: pnpm(速度とディスク効率)
  • PnP環境: yarn(ただし学習コスト高)

lockファイルの違い

package-lock.json(npm)

{
  "name": "my-app",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
        "react": "^18.3.0"
      }
    },
    "node_modules/react": {
      "version": "18.3.1",
      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
      "integrity": "sha512-..."
    }
  }
}

特徴:

  • JSON形式で可読性が高い
  • v3ではワークスペース対応
  • マージコンフリクトが起きやすい

yarn.lock(yarn)

react@^18.3.0:
  version "18.3.1"
  resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#..."
  integrity sha512-...
  dependencies:
    loose-envify "^1.1.0"

特徴:

  • YAML風テキスト形式
  • マージが比較的容易
  • PnP時は.pnp.cjsが実質的なlockファイル

pnpm-lock.yaml(pnpm)

lockfileVersion: '9.0'

settings:
  autoInstallPeers: true
  excludeLinksFromLockfile: false

importers:
  .:
    dependencies:
      react:
        specifier: ^18.3.0
        version: 18.3.1

packages:
  react@18.3.1:
    resolution: {integrity: sha512-...}
    dependencies:
      loose-envify: 1.4.0

特徴:

  • YAML形式で構造的
  • importersセクションでワークスペース管理
  • マージコンフリクトに強い設計

lockファイル比較

項目npmyarnpnpm
形式JSONテキストYAML
サイズ小〜中
マージ容易性
可読性✅✅
厳格性最高

機能比較表(2026年版)

機能npm v11yarn v4pnpm v9
インストール速度3/54/55/5
ディスク効率2/55/5(PnP)5/5
セキュリティ監査npm audityarn npm auditpnpm audit
パッチ適用yarn patchpnpm patch
Plug’n’Play実験的
Zero-Installs
厳格な依存関係✅✅
モノレポ✅✅
Corepack対応
プラグインシステム

移行手順

npmからpnpmへ

# pnpmインストール(Corepack推奨)
corepack enable
corepack prepare pnpm@latest --activate

# package-lock.json削除
rm -rf node_modules package-lock.json

# pnpmでインストール
pnpm install

# (オプション)npmスクリプトはそのまま使える
pnpm run dev
pnpm run build

注意点:

  • Phantom dependencies: npmで動いていたコードが動かなくなる可能性
    • 理由: npmは依存関係をフラット化するため、直接宣言していない依存も使える
    • 対策: pnpm install --shamefully-hoist(非推奨)または依存を明示的に追加
# 例: lodashを直接importしているがpackage.jsonにない場合
pnpm add lodash

npmからyarnへ

# Corepackでyarn有効化
corepack enable
corepack prepare yarn@stable --activate

# インストール
rm -rf node_modules package-lock.json
yarn install

# PnP有効化(オプション)
yarn config set nodeLinker pnp
yarn install

PnP導入時の注意:

  • エディタ設定が必要(VS Codeならyarn dlx @yarnpkg/sdks vscode
  • 一部のツールがPnP未対応の可能性

yarnからpnpmへ

corepack enable
corepack prepare pnpm@latest --activate

rm -rf node_modules yarn.lock .yarn .pnp.* .yarnrc.yml
pnpm install

移行チェックリスト

  • CI/CD設定を更新(npm cipnpm install --frozen-lockfile
  • Dockerfileを更新
  • package.jsonのscriptsは変更不要(そのまま動く)
  • 依存関係エラーがないかテスト実行
  • チーム全体に移行を通知
  • .npmrc.npmrc / .yarnrc.yml → 削除 / pnpm-workspace.yaml追加

pnpm設定のベストプラクティス

# .npmrc(プロジェクトルート)
shamefully-hoist=false
strict-peer-dependencies=true
auto-install-peers=true
node-linker=isolated

説明:

  • shamefully-hoist=false: 厳格な依存関係管理(推奨)
  • strict-peer-dependencies=true: peer依存の不整合でエラー
  • auto-install-peers=true: peer依存を自動インストール
  • node-linker=isolated: シンボリックリンクを使う(デフォルト)

CI/CD設定例

GitHub Actions(pnpm)

name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v3
        with:
          version: 9

      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'pnpm'

      - run: pnpm install --frozen-lockfile
      - run: pnpm run build
      - run: pnpm run test

GitHub Actions(yarn)

- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'yarn'

- run: corepack enable
- run: yarn install --immutable
- run: yarn run build

GitHub Actions(npm)

- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'

- run: npm ci
- run: npm run build

実際のプロジェクトでの使い分け

npm を選ぶべきケース

  • 小規模プロジェクト(dependencies < 50個)
  • チームがnpmに慣れている
  • 複雑な設定を避けたい
  • Node.js標準ツールだけで完結したい

yarn を選ぶべきケース

  • Plug’n’Playを活用したい
  • Zero-Installsでgit cloneだけで動かしたい
  • プラグインエコシステムが必要
  • Meta系プロジェクト(React、Jest等)との親和性重視

pnpm を選ぶべきケース(推奨)

  • モノレポ(複数パッケージ/アプリ)
  • ディスク容量が限られている(複数プロジェクトを並行開発)
  • CI/CD高速化が重要
  • 厳格な依存関係管理でバグを防ぎたい
  • 新規プロジェクト(2026年のベストプラクティス)

主要フレームワークの公式推奨(2026年)

フレームワーク推奨理由
Next.jspnpm / npmVercelがpnpm公式サポート
Nuxt 3pnpm公式ドキュメントでpnpm優先
Astropnpm / npmpnpmを推奨
SvelteKitnpm / pnpmどちらでも可
Remixnpm公式はnpm
Turborepopnpmモノレポツールとして最適

トラブルシューティング

pnpm: モジュールが見つからない

# 原因: Phantom dependencies
# 解決策: 依存を明示的に追加
pnpm add <missing-package>

# 一時回避(非推奨)
echo "shamefully-hoist=true" >> .npmrc
pnpm install

yarn PnP: エディタがモジュールを認識しない

# VS Code SDK生成
yarn dlx @yarnpkg/sdks vscode

# 設定ファイル確認
cat .vscode/settings.json

npm: lockファイルのマージコンフリクト

# 両方のブランチを取り込んでから再生成
git checkout --theirs package-lock.json
npm install
git add package-lock.json

まとめ — 2026年の最適解

🏆 総合評価

  1. pnpm: 速度・効率・厳格性で総合1位(⭐⭐⭐⭐⭐)
  2. yarn: 先進的機能・柔軟性(⭐⭐⭐⭐)
  3. npm: 安定性・シンプルさ(⭐⭐⭐)

推奨フローチャート

新規プロジェクト?
├─ YES → pnpm(迷ったらコレ)
└─ NO(既存)
   ├─ モノレポ? → pnpm移行を検討
   ├─ ディスク不足? → pnpm移行を検討
   ├─ CI遅い? → pnpm移行を検討
   └─ 問題ない → そのまま継続でOK

最終結論

2026年に新規プロジェクトを始めるなら、pnpmが最適解です。

理由:

  • インストール速度が圧倒的
  • ディスク使用量を大幅削減
  • モノレポで真価を発揮
  • 厳格な依存関係管理でバグ予防
  • 主要フレームワークが公式サポート

ただし、既存プロジェクトの移行はチームの状況を見て慎重に判断してください。npm/yarnでも十分に実用的です。

パッケージマネージャーはツールの一つ。プロジェクトの成功に最も重要なのは、チーム全体が使いこなせるツールを選ぶことです。


参考リンク: