iamkanae.dev

Blog

pnpmについて学んだメモ

pnpmというパッケージマネージャーについて知った。

npmとの違いは?

npmはディスク容量を大量に無駄遣いしたり、インストールの遅さに問題を抱えていた。pnpmはこれらの問題を解決することを目的に生まれた。

ディスク容量の節約と高速なインストール

npmではプロジェクトを作るたびに同じライブラリを重複してダウンロードしていたが、pnpmは共通の1箇所のみ(~/.pnpm-store)にライブラリの実体を保存する。各プロジェクトは ~/.pnpm-store へのハードリンクを作るだけ。
そのため、ディスク上には実態のファイルが一つだけの状態となり、従来よりディスク容量を使わなくて済むようになった。

また、2回目以降のインストールはリンクを貼るだけなので、高速で終わるようになった。

厳格な依存管理

npmは依存の重複を減らすために、node_modules内をフラット化している。これによって、package.jsonに書いていないライブラリまでコードから参照できるようになり、別の環境で突然動かなくなるようなリスクを抱えるようになった。
pnpmは独自のシンボリックリンクを採用しており、package.jsonに書かれているライブラリだけを明示的に参照可能にする仕組みにしている。

my-project/
├── package.json (foo のみ記述)
└── node_modules/
    ├── foo -> .pnpm/foo@1.0.0/node_modules/foo  (シンボリックリンク)
    └── .pnpm/
        ├── bar@1.0.0/
        │   └── node_modules/
        │       └── bar/
        │           └── index.js (グローバルストアへのハードリンク)
        └── foo@1.0.0/
            └── node_modules/
                ├── foo/
                │   └── index.js (グローバルストアへのハードリンク)
                └── bar -> ../../bar@1.0.0/node_modules/bar (シンボリックリンク)

使い方

npmのコマンドの頭文字をpnpmに変えるだけ。