0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Volta のメンテナンス終了と移行先 fnm の概要

0
Posted at

はじめに

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 のたびにバージョン指定ファイルを読んで切り替えます。

Microsoft.PowerShell_profile.ps1
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

package.json
{
  "volta": {
    "node": "22.15.1"
  }
}

✅ After

.node-version
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 の設定をあわせて行う必要があります。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?