pnpm vs npm vs yarn 2026年完全比較ガイド — 最速パッケージマネージャーはどれ?
pnpm vs npm vs yarn 2026年完全比較ガイド
Node.jsエコシステムにおけるパッケージマネージャーの選択は、プロジェクトの効率性に大きく影響します。2026年現在、主要な選択肢はnpm、yarn、そして急速に人気を集める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 v11 | yarn v4 | pnpm v9 | 最速 |
|---|---|---|---|---|
| 初回インストール(キャッシュなし) | 47.2s | 38.5s | 22.1s | pnpm |
| 2回目(キャッシュあり) | 18.3s | 12.7s | 5.8s | pnpm |
| node_modules削除後(キャッシュあり) | 16.9s | 11.4s | 4.2s | pnpm |
| CI環境(キャッシュなし) | 52.1s | 41.3s | 25.6s | pnpm |
考察
pnpmが圧倒的に高速です。特にキャッシュがある状態では、npmの約3倍、yarnの約2倍の速度を記録しました。
理由:
- コンテンツアドレッサブルストレージ: pnpmはグローバルストアにパッケージを1回だけ保存し、プロジェクトからシンボリックリンクで参照
- 並列処理の最適化: 依存関係の解決とダウンロードを効率的に並列化
- 厳格な依存関係グラフ: 不要なパッケージを一切インストールしない
ディスク使用量比較
同じNext.jsプロジェクト(node_modules)を10個複製した場合:
| パッケージマネージャー | 1プロジェクト | 10プロジェクト | グローバルストア | 合計 |
|---|---|---|---|---|
| npm | 587MB | 5.87GB | - | 5.87GB |
| yarn (PnP無効) | 562MB | 5.62GB | - | 5.62GB |
| yarn (PnP有効) | 2.1MB | 21MB | 520MB | 541MB |
| pnpm | 587MB | 1.2GB | 580MB | 1.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
評価: ✅✅ 最も高速、厳格な依存関係、フィルタリング強力
モノレポ比較まとめ
| 機能 | npm | yarn | pnpm |
|---|---|---|---|
| 基本ワークスペース | ✅ | ✅ | ✅ |
| 並列実行 | ✅ | ✅ | ✅✅ |
| フィルタリング | △ | ✅ | ✅✅ |
| 依存関係の厳格性 | △ | ✅ | ✅✅ |
| ディスク効率 | ❌ | ✅ | ✅✅ |
推奨:
- 小規模モノレポ: 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ファイル比較
| 項目 | npm | yarn | pnpm |
|---|---|---|---|
| 形式 | JSON | テキスト | YAML |
| サイズ | 大 | 中 | 小〜中 |
| マージ容易性 | △ | ✅ | ✅ |
| 可読性 | ✅ | ✅ | ✅✅ |
| 厳格性 | 中 | 高 | 最高 |
機能比較表(2026年版)
| 機能 | npm v11 | yarn v4 | pnpm v9 |
|---|---|---|---|
| インストール速度 | 3/5 | 4/5 | 5/5 |
| ディスク効率 | 2/5 | 5/5(PnP) | 5/5 |
| セキュリティ監査 | ✅ npm audit | ✅ yarn npm audit | ✅ pnpm audit |
| パッチ適用 | ❌ | ✅ yarn patch | ✅ pnpm 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 ci→pnpm 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.js | pnpm / npm | Vercelがpnpm公式サポート |
| Nuxt 3 | pnpm | 公式ドキュメントでpnpm優先 |
| Astro | pnpm / npm | pnpmを推奨 |
| SvelteKit | npm / pnpm | どちらでも可 |
| Remix | npm | 公式はnpm |
| Turborepo | pnpm | モノレポツールとして最適 |
トラブルシューティング
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年の最適解
🏆 総合評価
- pnpm: 速度・効率・厳格性で総合1位(⭐⭐⭐⭐⭐)
- yarn: 先進的機能・柔軟性(⭐⭐⭐⭐)
- npm: 安定性・シンプルさ(⭐⭐⭐)
推奨フローチャート
新規プロジェクト?
├─ YES → pnpm(迷ったらコレ)
└─ NO(既存)
├─ モノレポ? → pnpm移行を検討
├─ ディスク不足? → pnpm移行を検討
├─ CI遅い? → pnpm移行を検討
└─ 問題ない → そのまま継続でOK
最終結論
2026年に新規プロジェクトを始めるなら、pnpmが最適解です。
理由:
- インストール速度が圧倒的
- ディスク使用量を大幅削減
- モノレポで真価を発揮
- 厳格な依存関係管理でバグ予防
- 主要フレームワークが公式サポート
ただし、既存プロジェクトの移行はチームの状況を見て慎重に判断してください。npm/yarnでも十分に実用的です。
パッケージマネージャーはツールの一つ。プロジェクトの成功に最も重要なのは、チーム全体が使いこなせるツールを選ぶことです。
参考リンク: