JavaScript、特にNode.jsにおけるパッケージ管理としてnpmがよく使われています。プロジェクトごとにnode_modulesというフォルダが作成されて、その中で必要なパッケージが管理されます。とても便利な仕組みなのですが、node_modulesが肥大化するという問題がよく知られています。さらにそれがプロジェクトごとに存在すると、ディスク容量もあっという間に食いつぶしてしまいます。

今回はそうした問題を解決してくれるpnpmという新しいパッケージ管理を紹介します。他のパッケージ管理との比較も行ってみます。

pnpmのインストール

pnpm自体のインストールはnpmで行います。これは致し方ないでしょう。

終わったら phpmpnpx コマンドが使えるようになります。 phpmnpm 相当、 pnpxnpx 相当のコマンドになります。

インストール速度の比較

では実際にmonacaライブラリをインストールして速度を比較してみます。まず標準のnpmでインストールした場合です。

これは普通のコマンドで、12秒かかっています。では次にpnpmを使ってみます。

4.7秒でインストールされています。標準のコマンドに比べて3倍近い速度でインストールが完了しています。

同じようにnpmの代替となるパッケージ管理、yarnでも試してみます。

この場合、8.4秒です。npmよりは速いですが、pnpmには及びません。

もう一つ、Rustで作られたパッケージ管理であるVoltaを使ってみました。こちらも高速性が売りですが、10秒かかってしまいました。

これらの比較でもpnpmがいかに高速か分かるかと思います。

ファイル管理について

次にファイル管理の状態を紹介します。通常、node_modulesの中にはインストールしたライブラリとその依存ライブラリがフォルダに分かれて並んでいます。

それに対してpnpmの場合は、インストールしたライブラリだけがあり、シンボリックリンク(ハードリンク)が作られています。実際のファイルは .pnpm フォルダの中にあります。

このようにシンボリックリンクを使うことで、実体を重複させることなく管理できるようになっています。requireなどはこれまで通り使えますので問題ありません。

乗り換える際には

pnpmはこれまでのNode.jsプロジェクトと同じくpackage.jsonが使えます(package-lock.jsonは使いません)。乗り換える際には一旦これまでのnode_modulesを削除し、pnpmをインストールした上で pnpm install コマンドを使ってライブラリをインストールし直してください。

まとめ

詳細はドキュメントがありますので、そちらを参照してください。基本的にはこれまでと変わらない使い方で、高速なライブラリインストールとディスク容量削減効果が望めるはずです。

pnpmを使うことで、ライブラリインストール時に時間がかかって待たされることもなくなるでしょう。開発をさくさくと進める上でも、高速なパッケージ管理は導入する価値がありそうです。

pnpm · Fast, disk space efficient package manager