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
のドキュメントを読むべきです。