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

pnpm vs npm

npm のフラットなツリー構造

npm はバージョン 3 以降、フラット化された依存関係ツリーを維持しています。これにより、ディスク容量の肥大化は軽減されますが、副作用としてnode_modulesディレクトリが乱雑になります。

一方、pnpm は、グローバルなオンディスクのコンテンツアドレス指定可能なストアへのハードリンクとシンボリックリンクを使用してnode_modulesを管理します。これにより、ディスク容量の使用量を大幅に削減できるだけでなく、node_modulesをクリーンに保つことができます。詳細については、ストアのレイアウトに関するドキュメントをご覧ください。

pnpm の適切なnode_modules構造の利点は、プロジェクトのpackage.jsonで指定されていないモジュールの使用を不可能にすることで、「些細なバグを回避するのに役立つ」ことです。

インストール

pnpm では、パッケージをpackage.jsonに保存せずにインストールすることはできません。pnpm addにパラメータが渡されない場合、パッケージは通常の依存関係として保存されます。 npm と同様に、--save-devおよび--save-optionalを使用して、パッケージを開発依存関係またはオプションの依存関係としてインストールできます。

この制限の結果、pnpm を使用するプロジェクトでは、依存関係を削除して孤立させない限り、無関係なパッケージは存在しません。そのため、pnpm のprune コマンドの実装では、prune するパッケージを指定することはできません。常に、すべての無関係なパッケージと孤立したパッケージが削除されます。

ディレクトリ依存関係

ディレクトリ依存関係は、file:プレフィックスで始まり、ファイルシステム内のディレクトリを指します。 npm と同様に、pnpm はこれらの依存関係をシンボリックリンクします。 npm とは異なり、pnpm はファイルの依存関係のインストールを実行しません。

つまり、 `bar@file:../bar`を依存関係として持つ`foo`(`<root>/foo`)というパッケージがある場合、`foo`で`pnpm install`を実行しても、pnpm は`<root>/bar`のインストールを実行しません。

モノレポの場合など、複数のパッケージに同時にインストールを実行する必要がある場合は、pnpm -rのドキュメントを参照してください。