pnpmはJavaScripr用のパッケージマネージャである。npmとの互換性を持つと同時に、速度とディスクスペース使用量が大幅に改善されている。今回バージョン5.0がリリースされたので、競合製品との違いを詳しく比較してみよう。
npm、Yarn、pnpmの3つは、JavaScriptエコシステムでは最も一般的なパッケージマネージャである。中核的な部分では、これらのパッケージ部分の動作は極めてよく似ている。いずれも依存性管理にはpackage.jsonファイルを使用し、ロックファイルを使って複数のマシン/インストール勘の一貫性を保証している。
pnpmが他と違うのはパッケージの管理方法だ。npmとYarnがプロジェクト毎に別々のパッケージのコピーをインストールするのに対して、pnpmはすべてのパッケージについて単一コピーを維持し、オリジナルインストレーションの参照にはハードリンクやシンボリックリンクを使用している。
このアプローチには大きなメリットが2つある — ディスクスペースの使用量の削減と、インストールプロセスの高速化だ。
多くの企業や開発者は、複数のプロジェクトで作業する上で、少なくともいくつかの依存関係を共有している。パッケージの重複はディスクスペースを浪費する結果になり、それが原因で大型のCI/CDビルドマシンの使用が必要になることも少なくない。さらには、開発者のローカルラップトップで使用可能なストレージスペースの総量を制限することにもなる。
このような重複は取るに足らないものだと思うかも知れないが、ここ数年でパッケージサイズは着実に増加しており、依存関係のフォルダが1,000MB以上のディスクスペースを消費していることも珍しくはないのだ。これらのサイズは、空のReactプロジェクトの消費量が200MB以下であるのに対して、空のAngularプロジェクトが300MB近いサイズであることを考えれば、容易に説明できる。
pnpm 5.0より前は重複管理がパッケージレベルで行われていたため、同じLodashのバージョンが2回使用されていた場合において、パッケージのインストールが1回で、2つのプロジェクトにリンクされていた。
pnpm 5.0では新たな連想ストレージ(content addressable storage)システムが導入されたことで、個々のファイル間の差異をpnpmがテストできるようになった。その結果として、異なるパッケージ内にイントールされた同一ファイルを列挙して、再利用することが可能になっている。例えば、最新のLodashリリースで変更されたファイルが、300近い全ファイル中の9つのみであった場合、新システムでは、変更されていない大部分のファイルについては、重複の必要を排除している。
pnpmのリンク方式のもうひとつのメリットは、インストール速度の向上だ。npmやYarnでは、パッケージをキャッシュすることで、同一ファイルの複数回のダウンロードを回避しているが、各インストールへのパッケージのコピーは実行している。このプロセスは、新たなシンボリックリンクの生成に比較すると、本質的に遅い処理である。
インストレーション速度の改善は、使用するプロジェクトやパッケージに依存するが、pnpmによるベンチマークによれば、ほとんどのユースケースにおいてインストール時間の大幅な低減が期待できる。
pnpm 5.0での変更点の一覧は、公式リリースノートに掲載されている。
pnpmはMITライセンスの下でリリースされている。詳細な情報は公式Webサイトで確認することができる。