Node.jsのバージョン管理はfnmが便利

Node.js のバージョン管理は fnm が便利だったので紹介します。

node のバージョン管理に Volta を利用していたのですが、pnpm を利用する場合にいくつか制限があったりして、 他に良い node のバージョン管理ツールがないか調べてみたところ fnm が良さそうだったので移行してみました。

Volta のアンインストールを行う

Uninstalling Volta | Volta

Linux の場合(WSL)

Volta のディレクトリを削除します。

rm -rf ~/.volta

あと .bashrc.profile などから Volta の設定を削除します。

Windows の場合

設定からアンインストール、または Scoop でインストールしている場合は以下のコマンドでアンインストールを行います。

scoop uninstall --purge volta

fnm のインストールを行う

GitHub \- Schniz/fnm: 🚀 Fast and simple Node.js version manager, built in Rust

Linux の場合(WSL)

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

ログアウトして再度ログインを行うと以下のエラーが表示されました。

error: Can’t create the symlink for multishells at “/run/user/1000/fnm_multishells/2418_1762986068457”. Maybe there are some issues with permissions for the directory? No such file or directory (os error 2)

以下のコマンドを実行することでエラーは解決しました。

sudo mkdir /run/user/1000
sudo chown user:user /run/user/1000

以下を .bashrc に記載しました。

FNM_PATH="${HOME}/.local/share/fnm"
if [ -d "$FNM_PATH" ]; then
  export PATH="$FNM_PATH:$PATH"
  eval "$(fnm env --shell bash --use-on-cd --version-file-strategy=recursive --corepack-enabled --resolve-engines)"
fi

--shell オプションに bash を指定し、--use-on-cd--version-file-strategy--corepack-enabled--resolve-engines オプションを追加しました。

指定したオプションの概要は以下の通りです。

オプション概要
--shellシェルを指定する。bash, zsh, fish, powershell など
--version-file-strategyrecursive を指定すると上位のディレクトリの package.json を考慮してくれるようになります
--use-on-cdディレクトリを移動するときに node のバージョンを自動で切り替えてくれる
--corepack-enablednode をインストールするときに corepack enable が自動で実行される。pnpmyarn などを利用している場合とても便利です
--resolve-enginespackage.jsonengines に記載されている node のバージョンを考慮してくれます

fnm/docs/configuration.md at master · Schniz/fnm

シェル上でのコマンドの補完機能は fnm completions で有効にすることができます。
.bashrc に以下を追加しました。

if which fnm > /dev/null 2>&1; then
  eval "$(fnm completions --shell bash)"
fi

Windows の場合

私はツールのインストールに Scoop を利用しているので以下のコマンドでインストールしました。

scoop install fnm

PowerShell の $PROFILE に以下を追加しました。

if (Get-Command fnm -ErrorAction SilentlyContinue) {
    fnm env --shell powershell `
        --use-on-cd `
        --version-file-strategy=recursive `
        --resolve-engines `
        --corepack-enabled
    | Out-String | Invoke-Expression
    fnm completions --shell powershell | Out-String | Invoke-Expression
}

fnm を使用する

node のインストール

以下のコマンドでバージョンを指定して node をインストールできます。

fnm install v24
fnm list
node -v
pnpm -v

ほかにもいくつかのバージョンの node をインストールして、ディレクトリを移動したときに node のバージョンが自動で切り替わることが確認できました。

まとめ

fnm は .node-version.nvmrcpackage.json に記載されている engines を考慮してくれるので、プロジェクトごとの Node.js バージョン管理がしやすくて良いです。

pnpm を使用する場合には、Volta のようにグローバルインストールや corepack 周りの制限がないのが良いと思います。