- 主な比較項目: クロスプラットフォーム、初期設定、Nodeバージョンのソース、日常的な使い勝手
Node Version Manager (NVM)
- GitHubリポジトリで75.2kスターを持つ、Nodeバージョン管理で最も人気のあるソリューション
- 早い時期に登場し、コミュニティで大きな人気を得た
- 完全なWindowsサポートはなく、GitBash、Cygwin、WSLなどで動作する
- Windows向けの別パッケージとしてnvm-windowsがあるが、NVM自体ではない
- POSIXシェル(bash、zsh)のみをサポートしており、Fishなどの利用者は対象外
- インストールは簡単なコマンドで可能
.nvmrc ファイルによって使用するNode.jsバージョンを判別できる
nvm use コマンドは現在のシェルでのみNode.jsバージョンを設定するため、プロジェクトフォルダを離れてもバージョンは維持される
- 現在のシェルのNode.jsバージョンと、プロジェクトに必要なバージョンを常に意識しなければならない負担がある
- すべてのNode.jsバージョンを手動で管理するよりは良いが、完全な統合にはほど遠い
N
- GitHubで18.5kスターを持つ人気のNode.jsバージョン管理ツール
- クロスプラットフォームではなく、NVMよりも制約が多い
- Windowsネイティブシェル、Git for Windows Bash、Cygwin DLLでは動作しない
- NPMやBrew経由で直接インストールするか、shスクリプトをダウンロードしてインストールできる
- package.jsonの
engines セクションから直接Nodeバージョンを検出できる
- 別のプロジェクトで正確なNode.jsバージョンを使うには、自分で追跡しなければならないという問題がある
- 「グローバル」なNode.jsバージョンを管理するため、シェルを閉じた後も最後のプロジェクトで使ったNodeバージョンが残る
Fast Node Manager (FNM)
- Rustで書かれたNodeバージョン管理ツールで、GitHubで15.2kスター
- この一覧で最初に登場するクロスプラットフォームのNodeバージョン管理ツール
- 追加パッケージなしでWindows上で実行できる
- インストール手順は明確で直感的
- シェルごとにNode.jsバージョンを管理し、プロジェクトで指定されたバージョンがない場合は「デフォルト」バージョンを使う
- フォルダベースでNode.jsバージョンを自動切り替えする機能があるが、設定が必要
- 自動切り替えを正しく機能させるには、必要なNode.jsバージョンをあらかじめインストールしておく必要がある
.node-version または .nvmrc ファイルでのみNodeバージョンを検出できる
Volta
- GitHubで10kスターを持つ、バージョン管理の世界で注目株
- Rustで書かれており、クロスプラットフォーム
- Unix系システムではインストール手順がスムーズ
- Node.jsバージョンの設定に追加ファイルは不要
- package.jsonから直接設定を取得する
engines セクションがVolta設定のすぐ隣にあるため、バージョンを簡単に同期できる
- ツールチェーン管理が可能で、Node.jsバージョンだけでなくYarnバージョンまで動的に切り替えられる
- インストールコマンドを実行するたびに、Node.jsとYarnのバージョンが宣言どおりであることを保証する
PNPM
- NPMやYarnの代替と見なされるが、Node.jsバージョンも管理できる
- クロスプラットフォームで、すべてのプラットフォームで同じNode.jsバージョン管理体験を提供する
- Nodeバージョン管理が中核機能ではないため、NPMやYarnと併用しにくい
- PNPMでインストールしたNode.jsにはCorepackが含まれない
- Node.jsバージョンはグローバルにしか管理できず、シェルごとの設定はできない
- プロジェクト間を移動してもNode.jsバージョンを動的に切り替えないため、自分で追跡する必要がある
結論
- Node.jsバージョン管理ツールは大きく進化してきた
- NVMは最も古く人気のあるソリューションであり、今もなおそうである
- しかしエコシステムは進化しており、N、FNM、Voltaなど多様なツールが登場している
- 現時点では、Voltaが最も機能豊富で完成度の高いNode.jsバージョン管理ツールに見える
- Voltaはクロスプラットフォームで、日常利用でもスムーズな体験を提供し、プロジェクトで使う他のツールまで管理してくれる
4件のコメント
別のパッケージとして管理するために学ぶのが面倒なので、私は単に brew unlink && brew link node@14 みたいに使っていますね。
あまりにもいろいろありすぎて、本気で学びたい気持ちが「微弱」になる。
昔、FileForgeでWindows向けの実行ファイルをあれこれ漁っていた頃を思い出すと、便利でもここまで便利でいいのかと思ってしまう。
私がバージョンマネージャーに期待するのは性能というより汎用性なのですが、その点では https://github.com/asdf-vm/asdf を十分満たしていて、普段から使っています。プラグイン次第で node だけでなく python、ruby、golang などもすべて管理できるので。
direnvplugin も便利に使っています。Nodenv もかなり良い代替手段なのに、言及がないのは少し残念ですね。GitHub star が 2.2k なので、あまり有名ではないと見なされて除外されたようです。
シェルスクリプトベースなので Windows 互換性が弱いのは NVM や N と似ていますが、その代わりグローバルな Node.js バージョンとは別に、フォルダ単位で Node.js バージョンを指定することも、特定バージョンの Node.js を使うシェル環境を新しく立ち上げることもできます。