メインコンテンツまでスキップ
Version: Next

pnpmのメリット

ディスク容量の節約

pnpmコンテンツ探索可能なストアの図。 図には、node_modules を持つ2つのプロジェクトがあります。 node_modules ディレクトリ内のファイルは、コンテンツ探索可能なストア内の同じファイルへのハードリンクです。

npmを使用すると、ある依存関係を使用しているプロジェクトが100個ある場合、 ディスクにその依存関係のコピーが100個保存されます。 pnpmを使用すると、依存関係はコンテンツ探索可能なストアに格納され、

  1. 異なるバージョンのパッケージに依存している場合は、更新されたファイルのみがストアに追加されます。 たとえば、100 個のファイルがある依存において、 新しいバージョンがそれらのファイルのうち 1 つだけに変更を加えた場合、 pnpm update は存関係全体を複製するのではなく、ストアにその新しいファイルのみを加えます。
  2. すべてのファイルは、ディスク上の 1 つの場所に保存されます。 パッケージが インストールされると、そのパッケージのファイルは 1 か所からハードリンクされ、追加のディスク領域を消費しません。 これにより、同じバージョンの依存をプロジェクト間で共有できます。

これらの結果、 プロジェクトと依存関係の数に比例してディスク上の領域を節約し、インストールが非常に高速になります。

インストール速度の向上

pnpmはインストールを次の3段階で行います。

  1. 依存関係の解決。 必要な依存関係をすべて特定し、フェッチしてストアに格納します。
  2. ディレクトリ構造の計算。 node_modules 内のディレクトリ構造は、依存関係に基づいて計算されます。
  3. 依存関係をリンク。 残りのすべての依存関係がフェッチされ、ストアからnode_modulesにハードリンクされます。

pnpm のインストールプロセスの図。 できるだけ早くパッケージを解決してフェッチしてハードリンクします。

この方法は、すべての依存関係を解決し、取得し、node_modulesに書き込むという従来の3段階のインストールプロセスよりも大幅に高速化されます。

Yarn Classic や npm のようなパッケージマネージャーがどのように依存パッケージをインストールするかを示した図。

フラットではない node_modules ディレクトリの作成

npm や Yarn Classic を使用して依存パッケージをインストールする場合、すべてのパッケージはモジュールディレクトリの直下に格納されます。 その結果、ソースコードは、プロジェクトへの依存関係として追加されていない依存パッケージにアクセスできてしまいます。

デフォルトでは、 pnpm はシンボリックリンクを使用して、プロジェクトの直接の依存関係のみをモジュールディレクトリの直下に追加します。

pnpm によって作成された node_modules ディレクトリの図。 ルート node_modules 内のパッケージは、node_modules/.pnpm ディレクトリ内のディレクトリへのシンボリックリンクです。

pnpm が作成する固有の node_modules 構造と、それが Node.js エコシステムで正常に動作する理由の詳細については、以下をお読みください:

ヒント

使用しているツールがシンボリックリンクでうまく機能しない場合でも、node-linker の設定を hoisted にすることで pnpm を使い続けることができるかもしれません。 この設定によって pnpm は、npm や Yarn Classic と似た node_modules ディレクトリを作成するようになります。