【pnpm入門】高速＆省スペースの秘密と、npm・Yarnとの徹底比較マトリクス

# 【pnpm入門】高速＆省スペースの秘密と、npm・Yarnとの徹底比較マトリクス

Node.jsのパッケージマネージャは、現在主流のものだけでも「npm」「Yarn」「pnpm」の3種類があります。最近は特に「pnpm」が注目されており、高速・省スペースがウリと言われる一方、「それってnpmやYarnとどう違うの？」という疑問を持つ方も多いはず。

本記事では、pnpmの特徴に加えて、npmやYarnとの比較をマトリクス（表）でまとめます。さらに、各パッケージマネージャの使いどころや、メリット・デメリットを章立てして深掘りしていきます。

## 1. はじめに：パッケージマネージャの役割

**パッケージマネージャ**とは、外部ライブラリ（パッケージ）を簡単に検索・インストール・アップデート・削除できるようにするツールです。  
- **インストールしたパッケージのバージョン管理**  
- **依存関係の解決**  
- **アップデートの容易化**  

これらがそろっていることで、開発者は自分でライブラリを探して手動で入れる手間を大幅に削減できるわけです。

---

## 2. npm・Yarn・pnpmの基本概要

- **npm (Node Package Manager)**  
  Node.js公式のパッケージマネージャで、最も利用者が多い。バージョン5以降でロックファイルが導入され、再現性の高いインストールが可能に。

- **Yarn**  
  Facebook（現Meta）が「npmより高速かつ安定した依存管理」を目指して開発。キャッシュ機構やプラグアンドプレイ(PnP)など先進的機能を持つ。

- **pnpm**  
  シンボリックリンクと共有キャッシュを活用して**ディスク容量節約**＆**高速インストール**を可能にするパッケージマネージャ。近年人気上昇中。

---

## 3. 比較マトリクス：npm vs Yarn vs pnpm

| 比較項目                    | npm                           | Yarn                                        | pnpm                                                                      |
|:---------------------------|:------------------------------|:-------------------------------------------|:--------------------------------------------------------------------------|
| **初出**                   | 2010年頃                      | 2016年頃                                    | 2016年頃                                                                   |
| **主な開発元**             | Node.js公式 (JS Foundation)   | Meta (旧Facebook)                          | コミュニティ主導                                                           |
| **ロックファイル**         | `package-lock.json`           | Yarn v1: `yarn.lock`<br>Yarn v2以降: 同様   | `pnpm-lock.yaml`                                                           |
| **高速化の仕組み**        | キャッシュ機能あり<br>（v5〜） | Yarn v1: キャッシュ強化<br>Yarn v2: PnPなど | 共有キャッシュ＋シンボリックリンクで重複ファイルを削減                    |
| **ディスク容量削減**       | 同じバージョンでも<br>各プロジェクトに重複格納 | Yarn v1: 重複格納<br>Yarn v2: PnPで一部改善   | **グローバルストア**からリンクするため<br>重複なし                         |
| **プラグイン・拡張**       | 公式機能が中心                | Yarnプラグイン (Berry世代)                 | スクリプトフックやプラグインコミュニティはまだ少なめ                      |
| **互換性**                 | デファクト標準                | npm互換ある程度あり<br>ただしPnP機能で調整   | npmレジストリをそのまま利用可能<br>npmスクリプトも大体そのまま使える       |
| **マルチレポ管理 (workspaces)** | npm v7以降に搭載             | Yarn workspaces                              | pnpm workspaces                                                            |
| **学習コスト**             | Node.js公式リポのため情報豊富 | npm互換コマンド多め                         | npmとほぼ同じコマンドだが<br>シンボリックリンク等の理解が必要              |
| **人気・導入率**           | 非常に高い (最古参・標準)      | 高い (Facebook発祥で人気)                  | 近年導入事例が増えているがnpm/Yarnよりは少ない                              |
| **ユニーク機能**           | -                              | PnP (Plug’n’Play) で`node_modules`不要化    | シンボリックリンクの徹底活用<br>ディスク負荷・ネットワーク負荷を最小限化   |
| **大規模チームでの実績**   | ほぼすべてのJSプロジェクトで   | 大手WebサービスやOSSプロジェクト            | 一部大規模サービスでも採用事例あり<br>まだnpmよりは数が少ない              |

---

## 4. npmの特徴と使いどころ

1. **Node.jsの標準パッケージマネージャ**  
   - Node.jsをインストールすると自動的に付いてくる。  
   - デファクトスタンダードとして圧倒的シェアと情報量。

2. **学習コストが低い・エコシステムが成熟**  
   - 使い方に関する日本語記事や公式ドキュメントが豊富。  
   - `npx`などの便利コマンドも用意されていて、簡単なスクリプト実行に重宝。

3. **弱み・注意点**  
   - npm v5以前はロックファイルがなく、依存の再現性に不安があったが、v5以降は改善。  
   - バージョンによっては速度に不満があるユーザがいるため（近年はかなり改善済み）。

---


## 5. Yarnの特徴と使いどころ

1. **Meta (旧Facebook)が開発**  
   - 「npmより高速・安定した依存解決」を目指して2016年頃に登場。  
   - 大手企業をはじめ、人気ライブラリやOSSでも導入実績多数。

2. **高速化・ワークスペース管理の先鞭**  
   - Yarn v1ではキャッシュをうまく利用し、`node_modules`の管理を改善。  
   - Yarn v2（別名Berry）ではPnPなど先進的機能を導入し、`node_modules`をほぼ作らずに依存を扱える。

3. **弱み・注意点**  
   - Yarn v2（PnP）の導入は既存ツールやプラグインとの互換性に注意が必要。  
   - コマンドの挙動や設定ファイルがnpmと少し異なり、チーム全体での移行にややハードルあり。

---

## 6. pnpmの特徴と使いどころ

1. **シンボリックリンク＋共有キャッシュで重複ダウンロード無し**  
   - **「ディスク容量が削減できる」**最大の理由。  
   - グローバルストアにパッケージの実体を一度だけ保存し、各プロジェクトはそれをリンク参照。

2. **インストールがとにかく速い**  
   - 既に同じバージョンがストアにあれば、ダウンロードをスキップしてリンクを貼るだけ。  
   - ネットワーク負荷も削減され、クリーンインストールでも時間が短縮。

3. **学習コストや注意点**  
   - npmと同じコマンドが多いが、「シンボリックリンクって何？」を理解していないとしくみが不透明に感じるかも。  
   - Windows環境だとシンボリックリンクの作成時に管理者権限や開発者モードが必要な場合がある。  

---


## 7. パフォーマンス＆ディスク容量削減の仕組み（pnpm編）

pnpmの肝は、**グローバルストア**と**シンボリックリンク**です。

1. **グローバルストア**  
   - 通常は`~/.pnpm-store`のような場所にパッケージの実体が一括管理される。  
   - 複数プロジェクトで同じバージョンのパッケージを使う場合、再ダウンロードは不要。

2. **シンボリックリンク（symbolic link）**  
   - Windowsでの「ショートカット」やmacOSの「エイリアス」に近い概念。  
   - 実際のファイルを複数置かず、**1つの実体ファイルを参照するリンク**をたくさん作るだけなので、ディスク使用量を節約できる。

3. **具体例**  
   - たとえばaxios@1.3.5を、プロジェクトAとプロジェクトBの両方で利用していても、グローバルストアにはaxios@1.3.5が**1回**しか置かれない。  
   - それぞれの`node_modules`では、ストア内のaxios@1.3.5を指し示す**シンボリックリンク**を作るだけ。  
   - インストール済みなら「リンクを張るだけ」なので、起動時間（インストール時間）も短い。

下記の図はイメージ例です（※あくまでも概念図）。

```plaintext
┌─────────────────────┐
│   ~/.pnpm-store     │  ← ここにライブラリの実体がずらっと置かれる
│   ├─ axios@1.3.5    │
│   ├─ react@17.0.2   │
│   ├─ ...            │
│   └─ lodash@4.17.21 │
└─────────────────────┘

┌─────────────────────┐
│  プロジェクトA       │
│   ├─ node_modules   │  
│   │   ├─ axios  → シンボリックリンク (実体はpnpm-store)
│   │   ├─ react  → シンボリックリンク
│   │   └─ lodash → シンボリックリンク
│   └─ ...
└─────────────────────┘

┌─────────────────────┐
│  プロジェクトB       │
│   ├─ node_modules   │
│   │   ├─ axios  → シンボリックリンク
│   │   └─ lodash → シンボリックリンク
│   └─ ...
└─────────────────────┘
```

---

## 8. どれを選ぶ？シナリオ別おすすめパターン

### シナリオ1：まずは手軽にNode.jsを始めたい
- **npm**  
  - Node.jsインストール時に同梱されており、何も追加でインストールしなくてもすぐ使える。  
  - 学習コスト最低限。

### シナリオ2：大規模プロジェクトを複数抱え、少しでもビルド時間・ディスク容量を削減したい
- **pnpm**  
  - シンボリックリンクと共有キャッシュで、同じバージョンを繰り返し使う場面が多いなら効果大。  
  - CI環境などで特にスピードメリットを感じやすい。

### シナリオ3：既存のnpmプロジェクトを移行したいが、先進的な機能にも興味がある
- **Yarn**  
  - Yarn v1を使うだけならnpm互換が高く移行しやすい。  
  - Yarn v2（Berry）のPnP機能を導入すると`node_modules`なしでも開発できるが、ツール互換など入念なチェックが必要。

### シナリオ4：チームメンバーの慣れとサポートに合わせたい
- **既にYarn文化が根付いているチーム**：Yarn継続が無難。  
- **npmベースのチーム**：npmのバージョンを最新にして（あるいはpnpm導入をチームで合意して）運用する。  
- **興味本位で個人プロジェクト**：pnpmを試して実感するのもおすすめ。

---

## 9. まとめ

1. **npm**  
   - Node.js標準で最も普及している。大規模コミュニティと豊富なドキュメントが強み。

2. **Yarn**  
   - Facebook発祥で高速化や高度な依存管理に注力。Yarn v2（PnP）はさらに先進的機能を搭載するが、互換性に注意。

3. **pnpm**  
   - シンボリックリンクとグローバルストアにより、**ディスク容量の削減**と**インストール高速化**を実現。  
   - 一度体感するとビルド時間の短さや省スペース性がやみつきに。

いずれのパッケージマネージャも、**npmレジストリ**上の同じパッケージを扱えるので、最終的にはチーム事情やプロジェクト規模、既存文化などを総合的に検討して選ぶことが重要です。

- 「ディスク容量を大幅に削減したい」「再インストールを高速にしたい」→ **pnpm**  
- 「大手の実績・コミュニティが欲しい」「互換性を優先したい」 → **npm**  
- 「PnPなど新機能を試してみたい」「Yarnベースのチームに参加する」→ **Yarn**

---

## 参考リンク

- [npm公式サイト](https://www.npmjs.com/)
- [Yarn公式サイト](https://yarnpkg.com/)
- [pnpm公式ドキュメント](https://pnpm.io/)

---

### おわりに

本記事では、npm・Yarn・pnpmを徹底比較するマトリクスを中心に、それぞれの強み・弱みや使いどころを解説しました。  
「どれが絶対的に優れている」というよりも、**チーム構成・開発規模・既存のノウハウ**によって選択肢は変わります。とはいえ、最近は特にpnpmの導入が増えており、**一度使うとビルド時間とディスク容量のメリットが癖になる**ことは間違いありません。  
皆さんもぜひ、自分のプロジェクトやチームにあったパッケージマネージャを選び、快適なNode.js開発を楽しんでください！