pnpmとは? 高速でディスク効率の高いパッケージマネージャー
pnpmはNode.jsのパッケージマネージャーで、各パッケージのバージョンをディスク上に一度だけ保存し、それをプロジェクトにhard linkで結び付けることで、インストールを高速かつ省スペースにします。
pnpmは同じpackage.jsonを読む、npmやYarnより高速でディスク効率の高い代替ツールです。その決定的な仕組みはグローバルなcontent-addressableストアです。各パッケージのバージョンは一度だけダウンロードされ、コピーではなく多数のプロジェクトにリンクされるため、新規インストールはしばしばリンクを作るだけで済みます。
pnpmとは何か
pnpm(「performant npm」)はNode.jsエコシステム向けのコマンドラインパッケージマネージャーです。monorepo向けのworkspace、宣言されていない依存関係へのアクセスを防ぐ厳格なnode_modulesレイアウト、そしてユーザーが期待するのと同じlockfile駆動の再現性をサポートします。
ストアの仕組み
pnpmがパッケージをインストールすると、ファイルをマシン上のグローバルストアに置き、それをプロジェクトのnode_modulesにhard linkします。同じディスク上で同じバージョンを必要とする2つのプロジェクトはバイトを共有します。これがpnpmのインストールが高速で、コピーの場合のわずかなディスク量しか使わない理由であり、特にmonorepoで顕著です。
使用例
pnpmはnpmのコマンドを忠実に模倣しているため、導入はほとんど体に染みついた操作で済みます。
# install from the lockfile (use in CI)
pnpm install --frozen-lockfile
# add a dependency
pnpm add lodash
# run a workspace package script
pnpm --filter web buildCI/CDでの役割
CIでは「pnpm install --frozen-lockfile」が再現可能なインストールを提供し、lockfileが古い場合には失敗します。pnpmのストアを実行間でcacheすることは、ストアが共有されコンテンツで指定されるため非常に効果的です。大規模なmonorepoでは、pnpmのインストール時間とディスク節約は意味のあるCIコスト削減になります。Latchkeyのようなマネージドrunnerでは、温まったpnpmストアのcacheに加え、一時的なレジストリの不調時の自動リトライにより、これらのインストールを高速かつ確実に保ちます。
代替ツール
npmはデフォルトでインストール不要ですが、大きなツリーでは遅くなります。Yarn(特にBerry)はPlug and Playとzero-installsを提供します。pnpmはインストール速度、ディスク使用量、厳格な依存関係の分離が最も重要な場面で優位に立ちます。
重要なポイント
- pnpmはパッケージをコピーする代わりに、共有のcontent-addressableストアからリンクします。
- これによりインストールが高速になり、monorepoでのディスク使用量が劇的に削減されます。
- CIでは「pnpm install --frozen-lockfile」を使い、グローバルストアをcacheしましょう。