EY-Office ブログ

パッケージマネージャーpnpmを知っていますか?

フロントエンドの開発にはたくさんの有用なnpmパッケージを利用していると思います。npmパッケージのインストール等に使うパッケージマネージャーには何を使っていますか? npmでしょうか、それともyarnでしょうか。

私はnpmを使っていますが、最近pnpmを知りました。とても興味深いパッケージマネージャーなので紹介したいと思います。

pnpm https://pnpm.io から

pmpmの特徴

日本語で書かれたpmpmホームページがあり、以下のように書かれています。

  • 速い
    • インストール時間が短いそうです
  • (ストレージ利用が)効率的
    • すでにPC(Mac)に同じnpmパッケージがインストールされていれば共有されます
  • モノリポ(モノリポジトリー)をサポート
    • 複数のプロジェクトで同じnpmを共有できます
    • yarnのWorkspacesが有名
    • npmもv7で追加されました
  • 厳格
    • npm/yarnはnode_modulesディレクトリーの直下に依存ライブラリーを含めフラットに配置されますが、pmpmでは依存ライブライーは依存ライブラリーは利用ライブラリーのnode_modulesディレクトリーに入る木構造になっています
    • npm/yarnでは直接インストールしてない依存ライブラリーをアプリから使えますが、pnpmでは使えません

yarnとどこが違うの? と思えるかも知れませんが、いつものnpm trends(npmダウンロード数)を見ると、pnpmは急速にダウンロード数をのばしています!

pnpm vs yarn

しかし、Google検索で見つかる日本語情報は少ないです・・・・

ストレージ利用が効率的

私は、Reactプロダクトの開発支援を行っているので、支援のために多数のサンプルプロジェクトを作っています。ざっと調べると作業ディレクトリーの下の100個ほどのReactプロジェクトがありました。😅
npm/yarnでは、npmパッケージはプロジェクト毎のnode_modulesディレクトリーにインストールされるので、私のMacのディスク上には同じnpmパッケージが大量にインストールされている事になります。

しかし、pnpmではnpmパッケージを共有するようです。どのように共有するかはファイルシステムのハードリンクを使うそうです。 どれくらいストレージが節約されるのか調べてみました。
以前書いたAutocompleteの初期値が設定されないですのテストプロジェクトで試してみました。

npmでインストールした場合、377Mbyte使っています。

$ cd t-autocomp
$ rm -rf node_modules
$ npm install
$ du -sm
377

pnpmでインストールした場合、303Mbyte使っています。

$ cd t-autocomp
$ rm -rf node_modules
$ pnpm install
$ du -sm
303

あれ❗たいして効率的でないね❓

そうか、duコマンドはハードリンク部分も容量に含まれます。そこでいろいろと調べるとfindコマンドはハードリンク数を調べられるので。 以下のコマンドでは、Gnu findコマンドとawkコマンドを使いハードリンクを使ってファイル共有してない(リンク数1)のファイルの合計サイズが求められます。

$ gfind . -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'

また、次のコマンドでは全ファイルの合計サイズが求められます。

$ gfind . -type f -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'

npmでインストールした場合、ハードリンク数に関係なく約253Mbyte使っています。

$ cd t-autocomp
$ rm -rf node_modules
$ npm install
$ gfind . -type f  -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'
252.9
$ gfind . -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'
252.9

pnpmでインストールした場合、ハードリンクされてないファイルは約4Mbyteしか使っていません ❗❗

$ cd t-autocomp
$ rm -rf node_modules
$ pnpm install
$ gfind . -type f  -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'
229.0
$ gfind . -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s/(1024*1024)}'
3.9

まとめ

ということで、pnpm私にとってはありがたいパッケージマネージャーかも知れません!

インストール速度はnpmでもキャッシュされていれば速いので、pnpmがそれほど速いように思えませんでしたが・・・
厳格な管理がの影響が気になりますが、しばらく使っていきたいと思います。

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ