bgImage
Github
Qiita
X(Twitter)
SourceCode

使用したことのないパッケージマネージャーを比較してみた

    
coverImage

以前yarnを使用していた時はイマイチ使いづらかったり、npmが改善を重ねて速度的にも問題ない状況だったため
開発安定性重視のため長い期間npmをメインに使用してきました。開発現場を幾つかみてきた中では

最近では以前よりもbunが早くて安定しているという話を多く聞いたり、GitHub上のReadMeを見てもpnpmを使用する
インストール方法がデフォルトで記載されていることも増えてきたため、現状を検証してみました。

times-検証

icon
せな
@sena-v.com
今日は比較的余裕あるしbun or pnpmするか
スレッドを開く
icon
せな
@sena-v.com
bunのメリットとしてpnpm以下パケマネよりもインストールが早いところが上がるけどpnpmの最大メリットであるディスク効率化考えるとどっちがいいかって一概に言えないんだよな、とは言え最近の開発だとnode_modules増えすぎて容量足りないなんてのは見たことないしここだけ考えるとどっちでも感ある
icon
せな
@sena-v.com
pnpmはpackage.json内の厳密アクセスが優位っぽいけど割とこれ系で困ることって「共有名メソッドが存在する場合の補完関連で変なの使っちゃってた〜!」くらいでそんなに困ったことないよな
icon
せな
@sena-v.com
強いていうならbunはちょっとOP気味というかできる範囲が多い分install速度早めるためだけに導入して今使ってるライブラリor将来使うライブラリとの相性問題踏まないか?ってところは懸念あるんだよな
icon
せな
@sena-v.com
というかゼロインストールで現状npm install 4.26s user 3.31s こんなもんだし速度優先で考える必要ないなこれ
icon
せな
@sena-v.com
pnpm install 10.79s user 8.81s vs pnpm install 2.58s user 3.54s仕様上初回はやっぱ時間かかるけど2回目以降は結構良さげだね
icon
せな
@sena-v.com
これパケマネが厳密になった分直接installしてないものは再度installが必要になってちょっとめんどくさいな、Nextでvanilla-extract使う時"vanilla-extract/css"で使えてたけどpnpm経由だとちゃんと"vanilla-extract/css"をinstallしないといけなくなった
icon
せな
@sena-v.com
まぁでも厳密にやんなさいよ、ってところ以外は悪くないか
icon
せな
@sena-v.com
最終的に初回インストールは遅いってところは結構ネックだからローカル実行ならともかくCIだとコンテナ使い捨てであんまりメリット感じないし、よっぽど似たpackage使い回すプロジェクトが並列で走ってないならまぁええか・・・って感じだな
icon
せな
@sena-v.com
そういえばローカルだとrm -r node_modules && npm installで治るタイプのキャッシュバグ偶に踏むけど、pnpmはリンク貼ってるだけとかいう記事をみるとpnpm i -f必須になるなら余計めんどくさそうな気もするな
icon
せな
@sena-v.com
まぁユースケースに合うか次第なのでね
icon
せな
@sena-v.com
というか最初の目的であるストレージ節約がどうでも良くなった文脈だと自分のプロジェクトでbun vs npmで速度出した方がよくないか?となったのでやってみよう
icon
せな
@sena-v.com
npm install 4.39s user 3.44s vs bun install 1.65s user 1.43sすませんした(大声土下座)
icon
せな
@sena-v.com
ここはともかくnpm scriptsまでbunに置き換える理由が思いつかんな...? ↓ npm run typecheck 3.66s bun run build 32.47s bun run typecheck 2.10s npm run build 32.75sすごいじゃん?パッケージ内の処理多寡依存っぽいかな?

検証して思ったこと

事前に懸念していたこととして相性問題みたいなものがあったが、基本的には入れ替えだけで普通に動作した。
数年前はどうだったかわからないが、メジャーどころとの相性感は問題なさそうで良かった。
とはいえそれぞれメリデメが存在するため個々のユースケースに一番あったものを取り入れていくと良い。

pnpmの良かったところ

  • 共有領域参照のため、同じバージョン・ライブラリを使用する環境では大幅に時間と容量節約が可能
  • npm純正よりはある程度早い、思いライブラリへの依存どんどん増えたら差が出るかも

pnpmの気になったところ

  • pnpm専用領域にインストールしハードリンク参照をする関係上、初回インストールはそこまで早くない
  • package.jsonにインストールされた物にしかアクセス不可なため面倒さが増える可能性あり

特に気になった点として、ハードリンク化される=package.jsonに書かれている物にのみアクセスが可能になるため、
新規ライブラリを採用した際公式ドキュメントがpnpm前提でない場合は個別にインストールが必要となり
package.jsonの記述が場合によっては長大になり、著しく読みづらくなる可能性もありそうです。

bunの良かったところ

  • npm installと比較してかなり早い(ここのメリットがかなり大きい)
  • tsファイルの実行が楽(ts-node --esmのオプションを考慮しなくても動く)

bunの気になったところ

個人的にはpnpmに関しては現状あまり導入するメリットは感じなかった。
PCの容量についてはケチる方が悪いという考えの元強いて採用メリットがありそうな状況をあげるとしたら、
lockファイルがバイナリ形式で書き出されて欲しくない(差分が見たい)がインストール速度を上げたい、
かつimportが厳密になるのは許容できる場合には選択肢にあげてもいいかもしれないと思った。

bunに関しては速度がかなり違うのでそれだけでもかなり採用価値があると思う。 このブログに関しては上に記載したrenovateを使用してパッケージを最新化しているが、そういったケースでも
CIのinstall時にのみbun installを使用することでインストール時間削減の恩恵を受けられる。
GitHub ActionsのCI用コンテナは割と当たり外れが激しく、インストール時間が伸びることも多いため、
小技で時間削減ができる箇所はどんどん削減していくとCI実行時間が短縮されるためメリットが大きい。

まとめ

  • 昔は不明だが現状相性問題はそこまで感じないため、bunやpnpmへの乗り換えは積極的にやっていきたい
  • pnpmはバイナリ形式ではないlockファイルが欲しいが、install速度を少しでも早めたい場合に有用
  • bunはinstall速度がかなり高速なため、特段理由がなければメイン使いしても良さそう
  • CIの実行時に限定して使うという意味ではbunがかなり選択肢として良さそう

2024-03-06

- 1 -

Search Menu
・フリーワード(タイトル)
・ジャンルタグ
・年数
現在の総表示記事数:28