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

pnpmとnpmの比較

npmの平坦なツリー構造

npmバージョン3から、平坦な依存対象ツリーとして管理するようになりました。 node_modulesディレクトリの使用するディスク領域の使用量を軽減できるようになったのですが、副作用としてディレクトリの内容は乱雑になってしまいました。

一方pnpmは、いずれかのディスク上に存在するグローバルコンテンツストアに対するハードリンクとシンボリックリンクで、node_modulesを管理します。 この方法は、ディスク領域の使用量をかなり軽減しつつ、node_modulesの内容を簡潔に保つことができます。 コンテンツストアのレイアウトについて詳しくは対応するドキュメントを参照してください。

pnpmの適切なnode_modules構造によりもたらされる利点とは、プロジェクトのpackage.jsonで指定した以外のモジュールを使用できないようにすることで、「ささいな間違いを犯さないようにすること (helps to avoid silly bugs) 」です。

インストール

pnpmではpackage.jsonへ追加せずに依存パッケージをインストールできません。 pnpm addに何も引数を指定しなければ、指定したパッケージは通常の依存パッケージとして保存されます。 npmのように--save-dev--save-optionalを指定すれば、開発用あるいはオプションの依存パッケージとして保存することもできます。

結果として、依存関係を削除して、孤立したパッケージだけを残したりしない限り、pnpmを使っていれば無関係なパッケージをプロジェクトに残してしまうことは無くなるでしょう。 pnpmのpruneコマンドにパッケージを指定できないのはそのためです。常に無関係だったり孤立したパッケージを削除します。

ディレクトリに対する依存関係

ディレクトリに対する依存関係とは、接頭辞がfile:でファイルシステム中のディレクトリを参照している依存関係のことです。 npmと同様に、pnpmはそれらの依存関係に対するシンボリックリンクを作成します。 ただしnpmと違って、pnpmはファイル依存関係をインストールしません。

つまり、fooというパッケージ(<root>/foo)の依存関係にbar@file:.../barがあるとき、あなたがfooパッケージでpnpm installを実行しても、<root>/barをインストールしないということです。

モノリポを使用している場合など、さまざまなパッケージを同時にインストールしなければならないときは、pnpm -rのドキュメントを読むべきです。