フロントエンドの開発にはたくさんの有用なnpmパッケージを利用していると思います。npmパッケージのインストール等に使うパッケージマネージャーには何を使っていますか? npmでしょうか、それともyarnでしょうか。
私はnpmを使っていますが、最近pnpmを知りました。とても興味深いパッケージマネージャーなので紹介したいと思います。
pmpmの特徴
日本語で書かれたpmpmホームページがあり、以下のように書かれています。
- 速い
- インストール時間が短いそうです
- (ストレージ利用が)効率的
- すでにPC(Mac)に同じnpmパッケージがインストールされていれば共有されます
- モノリポ(モノリポジトリー)をサポート
- 複数のプロジェクトで同じnpmを共有できます
- yarnのWorkspacesが有名
- npmもv7で追加されました
- 厳格
- npm/yarnは
node_modules
ディレクトリーの直下に依存ライブラリーを含めフラットに配置されますが、pmpmでは依存ライブライーは依存ライブラリーは利用ライブラリーのnode_modules
ディレクトリーに入る木構造になっています - npm/yarnでは直接インストールしてない依存ライブラリーをアプリから使えますが、pnpmでは使えません
- npm/yarnは
yarnとどこが違うの? と思えるかも知れませんが、いつものnpm trends(npmダウンロード数)を見ると、pnpmは急速にダウンロード数をのばしています!
しかし、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がそれほど速いように思えませんでしたが・・・
厳格な管理がの影響が気になりますが、しばらく使っていきたいと思います。