BT

InfoQ ホームページ ニュース pnpm: スペース効率に優れたJavaScriptパッケージマネージャ

pnpm: スペース効率に優れたJavaScriptパッケージマネージャ

ブックマーク

原文(投稿日:2020/06/01)へのリンク

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サイトで確認することができる。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。