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
のドキュメントを参照してください。