🔍

Mac用にNode.jsのバージョン管理ツールを比較・検討し直した話【2023年】

2023/06/24に公開

きっかけ

以前使っていた私用のMacが限界を迎えつつあったので、思い切って新しいMacをお迎えしました。

まずはフロント周りの環境構築をしようと思ったのですが、「でもどうせなら新しいツールとか入れてみたいよね」と思いまして、休日を使ってNode.jsの新しいバージョン管理ツールを探す旅に出ました。

その際のメモがまとまったので、誰かの参考になればと思い、久しぶりに投稿します。

私の環境は以下の通りです。

  • MacBook Air(M2、2022)
  • macOS:Ventura 13.4.1

バージョン管理ツールの比較一覧

これまでは nvmnode-env を使っていたのですが、最近は他にも色々ありそうなのでちょっと探してみました。

探す際の条件は以下の通りです。

  • 直近1年以内に更新されている
  • スター数が5k以上
  • プロジェクトごとにバージョンを指定できる
  • Macで使える

そして私が見つけたのは以下の5件になります。
※ 以下は記事執筆時点の情報です。

名前 対応している設定ファイル スター数 最新バージョンとリリース日
asdf .node-version
.nvmrc
17.8k v0.12.0
(2023-06-09)
volta package.json 8.3k v1.1.1
(2023-01-25)
fnm .node-version
.nvmrc
12.2k v1.33.1
(2022-12-06)
n .n-node-version
.node-version
.nvmrc
package.json
17.7k 9.1.0
(2023-04-15)
nvm .nvmrc 68k v0.39.3
(2022-12-24)

スター数だけを見ると nvm の圧勝ですね。

でも、どうせなら新しいやつを使ってみたい。
個人的に初めて目にするものもあって、なんだか面白そうです。

それでは簡単ではありますが、個別に見ていきましょう。

asdf

https://github.com/asdf-vm/asdf

複数の言語に対応したバージョン管理ツールです。
anyenv の上位互換的なイメージですね。

Manage multiple runtime versions with a single CLI tool, extendable via plugins

"asdfの画像"

インストール手順は以下です。
gitcurl が必要なので、必要に応じてそちらもインストールしましょう。

# install curl and git
brew install coreutils curl git

# download asdf
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.12.0

そして、以下の設定を ~/.zshrc~/.bashrc に追記したらOKです。

. "$HOME/.asdf/asdf.sh"

補完機能もあるのが素敵ですね。
以下はzsh用の設定。Bashはこちら

# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit

実際に利用する際は、各言語のプラグインを入れて管理します。

# Node.jsの場合はこうなる
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf install nodejs latest

# グローバルで使用する場合
asdf global nodejs latest

# ローカルで使用する場合
asdf local nodejs latest

プラグインを自作することもできるみたいで、ちょっと楽しそう。
https://asdf-vm.com/plugins/create.html

GitHubにテンプレートも公開されています。
https://github.com/asdf-vm/asdf-plugin-template

.tool-versions というファイルで全てのバージョン定義を管理するので、チームでの管理が楽そうですね。
ファイルの中身はこんな感じです。

nodejs 20.3.1

Volta

https://github.com/volta-cli/volta

Rust製のNode.jsバージョン管理ツールです。
公式では「手間要らずのJavaScriptツールマネージャー」と説明されています。

The Hassle-Free JavaScript Tool Manager

"Voltaの画像"

使い始めるには以下2ステップでOK。

# install Volta
curl https://get.volta.sh | bash

# install Node
volta install node

ツールのバージョンを固定する場合は package.json を使います。

"volta": {
  "node": "12.20.2",
  "yarn": "1.19.2"
}

バージョン設定用のファイルを追加しなくて良いので、新規にプロジェクトを開始する場合はちょっと楽かもですね。

fnm

https://github.com/Schniz/fnm

こちらもRust製のNode.jsバージョン管理ツールです。
名前の由来は Fast Node Manager の頭文字ということで、スピードへのこだわりが感じられます。

🚀 Fast and simple Node.js version manager, built in Rust

"fnmの画像"

使い始めるには以下でOKとのこと。
(Windowsの場合は色々事前準備が必要そう)

# install fnm
curl -fsSL https://fnm.vercel.app/install | bash

# install Node
fnm install

# set latest Node
fnm use

Voltaとは異なり、バージョン設定用ファイルとして.node-version と .nvmrc が使えます。

既存の設定ファイルをそのまま利用したい場合は便利ですね。

n

https://github.com/tj/n

名前の通り、シンプルさを追求したNode.jsバージョン管理ツールです。
コマンド打つ際もタイプ数が少なくて良い感じですね。

Node.js version management: no subshells, no profile setup, no convoluted API, just simple.

"nの画像"

インストール方法は色々あるようですが、npmでもbrewで一発です。

# use npm 
npm install -g n

# use Homebrew
brew install n

バージョン設定ファイルはよりどりみどりなので、選択肢に困ることはなさそうですね。

  • .n-node-version
  • .node-version
  • .nvmrc
  • package.json

シンプルさと大きな度量を兼ね備えた姿が素敵です。

nvm

https://github.com/nvm-sh/nvm

Node Version Manager、略して nvm 。名は体を表すとはこのことですね。
誰もが一度は名前を耳にしたことがありそう。

Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions

"nvmの画像"

インストールは以下でOK。

# install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

# install Node
nvm install node

# set latest Node
nvm use node

バージョン設定ファイルはもちろん .nvmrc ですね。

今回調べていて気づいたのですが、 nvm のバージョンってまだ v0.39.3 なんですね。

安定感抜群のイメージなのでちょっとびっくり。
そういえば7 Days to Dieもずっとα版ですね

まとめ

ここまで5種類のNode.jsバージョン管理ツールを見てきましたが、どれも人気と実力を兼ね備えたツールなので、どれを選んでも問題なさそうです。

ただ、個人で利用する場合は新しいツールでも問題ないと思いますが、チームで導入する場合は利用者が多くてある程度枯れたツールの方が安心感があると思います。

その上で強いて選ぶ基準を挙げるとするなら、以下のような感じでしょうか。

  • 個人で利用する
    • 複数言語を利用する → asdf
    • Node.jsがメイン → Volta
  • チームで利用する
    • スピード重視 → fnm
    • シンプルさ重視 → n
    • 安定感重視 → nvm

私は個人で利用する&複数言語を利用するので、今回は asdf を導入することにしました。

新しいツールを触るのってワクワクしますね!

それでは、良き開発Lifeを!

参考にさせていただいた記事

素晴らしい記事をありがとうございました!

https://qiita.com/heppokofrontend/items/5c4cc738c5239f4afe02

https://zenn.dev/noraworld/articles/replace-anyenv-with-asdf

https://zenn.dev/aiueda/articles/7dcecaa05d4f24

Discussion