動機
ディスク容量の節約
npm を使用する場合、ある依存関係を使用するプロジェクトが 100 個あると、その依存関係のコピーがディスクに 100 個保存されます。 pnpm を使用すると、依存関係はコンテンツアドレス指定可能なストアに保存されるため、
- 依存関係の異なるバージョンに依存している場合、異なるファイルのみがストアに追加されます。 たとえば、100 個のファイルがあり、新しいバージョンでそれらのファイルの 1 つだけが変更された場合、
pnpm update
は、1 つの変更のために依存関係全体を複製するのではなく、ストアに新しいファイルを 1 つだけ追加します。 - すべてのファイルはディスク上の 1 つの場所に保存されます。 パッケージがインストールされると、それらのファイルはその 1 つの場所からハードリンクされ、追加のディスク容量を消費しません。 これにより、プロジェクト間で同じバージョンの依存関係を共有できます。
その結果、プロジェクトと依存関係の数に比例してディスク容量を大幅に節約でき、インストールがはるかに高速になります。
インストール速度の向上
pnpm は 3 つの段階でインストールを実行します
- 依存関係の解決。 必要なすべての依存関係が識別され、ストアにフェッチされます。
- ディレクトリ構造の計算。 依存関係に基づいて
node_modules
ディレクトリ構造が計算されます。 - 依存関係のリンク。 残りのすべての依存関係がフェッチされ、ストアから
node_modules
にハードリンクされます。
このアプローチは、すべての依存関係を解決、フェッチ、および node_modules
に書き込む従来の 3 段階インストールプロセスよりも大幅に高速です。
フラットではない node_modules ディレクトリの作成
npm または Yarn Classic で依存関係をインストールする場合、すべてのパッケージはモジュールディレクトリのルートに hoist されます。 その結果、ソースコードはプロジェクトに依存関係として追加されていない依存関係にアクセスできます。
デフォルトでは、pnpm はシンボリックリンクを使用して、プロジェクトの直接の依存関係のみをモジュールディレクトリのルートに追加します。
pnpm が作成する独自の node_modules
構造と、それが Node.js エコシステムで正常に機能する理由の詳細については、以下をお読みください。
ヒント
ツールがシンボリックリンクでうまく機能しない場合は、pnpm を使用し、node-linker 設定を hoisted
に設定できます。 これにより、pnpm は npm および Yarn Classic によって作成されたものと同様の node_modules ディレクトリを作成するように指示されます。