メインコンテンツにスキップ
バージョン: 9.x

動機

ディスク容量の節約

An illustration of the pnpm content-addressable store. On the illustration there are two projects with node_modules. The files in the node_modules directories are hard links to the same files in the content-addressable store.

npm を使用する場合、ある依存関係を使用するプロジェクトが 100 個あると、その依存関係のコピーがディスクに 100 個保存されます。 pnpm を使用すると、依存関係はコンテンツアドレス指定可能なストアに保存されるため、

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

その結果、プロジェクトと依存関係の数に比例してディスク容量を大幅に節約でき、インストールがはるかに高速になります。

インストール速度の向上

pnpm は 3 つの段階でインストールを実行します

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

An illustration of the pnpm install process. Packages are resolved, fetched, and hard linked as soon as possible.

このアプローチは、すべての依存関係を解決、フェッチ、および node_modules に書き込む従来の 3 段階インストールプロセスよりも大幅に高速です。

An illustration of how package managers like Yarn Classic or npm install dependencies.

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

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

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

An illustration of a node_modules directory created by pnpm. Packages in the root node_modules are symlinks to directories inside the node_modules/.pnpm directory

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

ヒント

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