はじめに
Node.js のバージョン管理ツール Volta が、メンテナンス終了を宣言しました。この記事では、移行先の候補になる fnm(Fast Node Manager)の概要を記載します。
公式が推奨する移行先は mise です。mise は Python、Ruby、Go など Node.js 以外のランタイムも管理します。Node.js だけを管理できればよい場合は、単機能の fnm も選択肢になると思います。
開発環境
- Windows 11
- VSCode
- PowerShell 7
- fnm 1.39.0
- Node.js 24
fnm の概要
| 項目 | 内容 |
|---|---|
| 正式名称 | Fast Node Manager |
| 開発元 | Gal Schlezinger 氏(GitHub ID: Schniz)の個人アカウントで公開 |
| リポジトリ | Schniz/fnm |
| 実装言語 | Rust |
| ライセンス | GPL-3.0 |
| 対応 OS | Windows / macOS / Linux |
| 読み込むバージョン指定ファイル |
.node-version / .nvmrc / package.json の engines.node
|
開発時期
| 時期 | 出来事 |
|---|---|
| 2019年2月 | ReasonML(OCaml 系の言語)で実装した最初の版を公開。Linux と macOS のみ対応 |
| 2020年 | v1.22 で Rust に書き直し、Windows に対応 |
| 2021年3月 | 作者が Rust へ書き直した経緯をブログで公開 |
| 2024年11月 | v1.38.0 で engines.node の読み込みを既定で有効化 |
| 2026年3月 | v1.39.0 をリリース |
最初の版は、nvm より約40倍速い単一の実行ファイルとして公開されました。
書き直しの理由は作者のブログに書かれています。OCaml 版は Node.js の展開を外部の tar コマンドに頼っていて、Windows では動きませんでした。Rust では条件付きコンパイルで OS ごとの差を書けるため、Windows 版と *nix 版で一部の実装を分けています。
利用状況
2026年9月時点の GitHub リポジトリは、スター数 26.9k、フォーク数 648です。winget、Scoop、Chocolatey、Homebrew、Cargo で配布されています。
直近のリリース間隔は長めです。GitHub のリリースでは、v1.38.1 が 2024年11月17日、v1.39.0 が 2026年3月6日です。約1年4か月空いているので、Volta と同じくメンテナンス状況は定期的に確認したほうがよいと思います。
v1.39.0 では、fnm env --use-on-cd の実行時に初期バージョンを適用するようになりました。fnm use のサブプロセスが1回減り、シェルの起動が速くなっています。
仕組み
Volta と fnm では、node コマンドが呼ばれたときの動作が違います。
| 項目 | Volta | fnm |
|---|---|---|
| バージョンを決める時点 |
node を実行するたび |
シェル起動時と cd 実行時 |
| PATH に置くもの | shim(node を中継する実行ファイル) |
Node.js 本体のディレクトリを指すリンク |
| バージョンの指定場所 |
package.json の volta フィールド |
.node-version / .nvmrc / engines.node
|
| Yarn の管理 | する | しない |
fnm はシェルごとにリンクを1つ作り、PATH の先頭に追加します。fnm use を実行すると、リンクの参照先が別バージョンのディレクトリに切り替わります。
node の実行時に中継処理が入らないので、実行のたびにバージョンを判定する処理は発生しません。そのかわり、cd を経由せずに別ディレクトリのスクリプトを実行すると、今のシェルで選ばれているバージョンで動きます。
バージョン指定ファイルは、.nvmrc と .node-version が engines.node より優先されます。
Windows ではリンクを %LOCALAPPDATA%\fnm_multishells に作ります。シェルを閉じてもリンクは削除されず、フォルダー内に残り続けます。
利用方法
インストール
winget install Schniz.fnm
インストール後に PowerShell を開き直して確認します。
fnm --version
fnm 1.39.0
PowerShell の設定
スクリプトの実行が許可されていないとプロファイルが読み込まれないので、実行ポリシーを変更します。
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
プロファイルがなければ作成して、VSCode で開きます。
if (-not (Test-Path $PROFILE)) { New-Item $PROFILE -Force }
code $PROFILE
次の1行を追加します。--use-on-cd を付けると、cd のたびにバージョン指定ファイルを読んで切り替えます。
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
VSCode の統合ターミナルで PowerShell を使っている場合も、この設定が反映されます。
Node.js のインストールと切り替え
| コマンド | 動作 |
|---|---|
fnm install --lts |
最新の LTS 版をインストール |
fnm install 24 |
24系の最新版をインストール |
fnm install |
カレントディレクトリの指定ファイルにあるバージョンをインストール |
fnm use 24 |
今のシェルで使うバージョンを切り替え |
fnm default 24 |
新しいシェルで使う既定バージョンを設定 |
fnm list |
インストール済みのバージョンを表示 |
fnm list-remote |
インストールできるバージョンを表示 |
fnm install --lts
fnm default 24
node --version
v24.x.x
Volta からの移行
先に Volta をアンインストールします。PATH に Volta を含むパスが残っていたら、環境変数の設定画面から消します。残っていると、PowerShell のプロファイルを読まないコマンドプロンプトなどでは Volta 経由の古い Node.js が実行されます。
次に、プロジェクトのバージョン指定を書き換えます。fnm は package.json の volta フィールドを読みません。
❌ Before
{
"volta": {
"node": "22.15.1"
}
}
✅ After
22.15.1
作成後にプロジェクトのディレクトリへ cd すると、そのバージョンに切り替わります。未インストールのバージョンなら fnm install でインストールします。
Volta は Yarn のバージョンも固定していましたが、fnm は管理しません。package.json の packageManager フィールドと Corepack を使って固定します。Node.js 25 以降は Corepack が同梱されないので、npm install -g corepack で別途インストールします。グローバルパッケージは Node.js のバージョンごとに入るため、バージョンを追加するたびにこのコマンドを実行します。
まとめ
この記事では、Volta のメンテナンス終了を受けて、移行先候補の fnm の概要と使い方について記載しました。fnm は Gal Schlezinger 氏が 2019年から開発している Rust 製のツールで、shim を使わずシェルごとのリンクで Node.js を切り替えます。Volta と違って Yarn は管理しないので、移行時は .node-version の作成と Corepack の設定をあわせて行う必要があります。
参考
- Volta is unmaintained; we recommend migrating to mise · Issue #2080 · volta-cli/volta
- Schniz/fnm
- Releases · Schniz/fnm
- Why fnm was rewritten in Rust - Gal Schlezinger
- fnm: Fast and Simple Node.js Version Manager - DEV Community
- Using Default Version in the New Shell · Issue #1565 · Schniz/fnm
- Node.js TSC Votes to Stop Distributing Corepack - Socket.dev