npm から pnpm へ移行した話。容量削減と「3日も待てない」僕の選択

3つも書いてあるのはなんで?
パッケージのインストールコマンドを見ると、3つ書いてあることがあるじゃないですか。
pnpm install
yarn install
npm install どれでもいいよと。どれでもいいのになぜ3行も書いてあるのだ!?どうして npm が一番下で pnpm が一番上なんだ!?
というわけで、このタイミングで pnpm に興味を持った僕は、色々調べてみることにしました。
パッケージマネージャーとは?
パッケージマネージャーとは、ソフトウェアのインストール、アンインストール、アップデートなどを一元管理するシステムまたはツールのことです。ソフトウェアの「パッケージ」を扱い、依存関係の解決や複数のソフトウェアの同時管理を自動化します。
もっかい改めて書くと、プロジェクトに必要なパッケージをインストールしたり、更新したり、削除したりするのに使います。
JavaScript / TypeScript で利用するものでは、npm、yarn、pnpm、bun など、いくつかの選択肢があります。それぞれに特徴があって、開発者の好みやプロジェクトの要件によって選ばれています。
それぞれの特徴を比較してみた
調べてみると、それぞれに特徴があるんですよね。簡単にまとめてみました。
| パッケージマネージャー | インストール速度 | ディスク容量 | 特徴 |
|---|---|---|---|
| npm | 普通 | 多い | Node.js に標準付属。何も考えずに使えるが、容量を食う。 |
| yarn | 速い | 普通 | Facebook製。ワークスペース機能が強いが、容量はnpmと大差なし。 |
| pnpm | 速い | 少ない | シンボリックリンクで容量削減。厳格な依存関係管理。 |
| bun | 超速い | 普通 | 新しい。JavaScript ランタイムも兼ねる。 |
僕が気になったのは、ディスク容量と動作の快適さです。
npm は標準で付属しているから、何も考えずに使えて便利です。でも、各プロジェクトごとに node_modules にパッケージがコピーされちゃうから、複数のプロジェクトを管理しているとディスク容量がどんどん増えちゃうんですよね。
その点 pnpm は、パッケージを効率的に保存してくれるので容量も削減できるし、動作も快適らしい。「容量減って速くなるなら、文句あるわけないじゃないですか?」ということで pnpm を選びました。
ちなみに Bun は?
実は以前、Bun を試したことがありました。めちゃくちゃ速いんです。 でもその時は、爆速すぎて逆にビルドがうまく行かなくて利用を諦めちゃったんですよね(言い訳)。僕が試したのは Bun が出たばかりの頃だったので、今ならバッチリ移行できるかもしれません。でも今回は慎重にいきました。
移行はけっこう大変だった
「はい、コマンド一発で完了!」とはいきませんでした。結構大変でしたよ…。
まず、preinstall スクリプトを書き換える必要がありました。GitHub Actions のワークフローも修正が必要でした。
待てない僕の設定
設定ファイルの minimum-release-age を 1440 分(24時間)に設定しました。
これは「リリースされてから24時間経っていないパッケージはインストールしない」という安全策です。
コメントアウトされた設定例には「3日(4320分)」や「1週間(10080分)」もありましたが、ハッキリ言って待てません。 3日も待ってたら、そのパッケージのこと忘れちゃいますよ。僕は24時間が限界でした。ごめんなさい。
npx も書き換え
npx コマンドは、基本的に全て pnpm exec に置き換えました。
ほぼコマンドを変えずに移行できたら最高に楽だったんですけど、ちょこちょこ細かい修正が必要なのは、それぞれの制作者の「どーしてもゆずれないポリシー」なんでしょうね。郷に入っては郷に従えです。
移行して良かったこと
苦労はしましたが、移行して良かったことは間違いなくあります。
- 動作が快適: 実際に使ってみて、サクサク動くのが一番のメリットかなと感じています。
- 容量削減: 複数のプロジェクトを管理している人には、容量削減の効果がめちゃくちゃ実感できると思います。
まとめ
このタイミングで pnpm に興味を持った人の、せめてもの助けになれば嬉しいです。
パッケージマネージャーの選択は、開発体験に大きく影響します。npm しか使ったことなかった僕でも、なんとか移行できました(嘘です、苦労しました)。
細かい設定とかも入れてあるので、もし気になる奇特な方がいたら、今回のコミットログを覗いてみてください。
みなさんは、どのパッケージマネージャー使ってますか? これがいいよ!こうするといいよ!とかあったら教えてね!