Volta(ヴォルタ)は、Node.jsとnpm・Yarnのバージョンをプロジェクトごとに自動で切り替える、Rust製のJavaScriptツールマネージャーです。2025年11月14日、公式リポジトリのREADMEに Volta is unmaintained. と書かれ、保守は終わりました。この記事では、仕組み・基本コマンド・package.jsonでの版固定と、2026年10月21日にVolta 2.0.2とmise 2026.10.17を実際に動かして確かめた「すでに壊れている箇所」と移行手順を解説します。
まとめ|Voltaの正体と2026年時点の判断
- Voltaは「shim」と呼ぶ中継用の実行ファイルをPATHの先頭に置き、
nodeやnpmが呼ばれるたびに、カレントディレクトリの package.json を見て使う版を決めます。ディレクトリを移るだけで版が変わります。 - 最終リリースは2024年12月5日の2.0.2です。READMEは「今動いているものは当面動き続ける」としつつ、新しいOSやエコシステムの変化で壊れても直せないと書き、移行先としてmiseを推奨しています。
- 壊れ始めています。2.0.2ではpnpm 12が起動せず、Node.jsの展開に使うtarクレートの脆弱性(CVE-2026-33056)も修正されないまま残っています。
- プロジェクトの版は
volta pin node@24で package.json のvoltaキーに書き込まれます。このキーをmiseは読みませんが、GitHub Actionsの setup-node は読みます。 - 新規プロジェクトでVoltaを選ぶ理由はもうありません。pnpm 12へ上げる予定、OSの更新、メンバーの追加のどれかを控えているなら、先にmiseかfnmへ移るべきです。
Voltaの仕組み|shimによるnode・npm・yarnの版選択
読み方と管理できるツール
日本語では「ヴォルタ」または「ボルタ」と表記されます。公式サイトは volta.sh で、自らを「The Hassle-Free JavaScript Tool Manager」と名乗っています。同名の電池リサイクル企業やNVIDIAのGPU世代「Volta」とは関係ありません。管理対象は node・npm・yarn の3つと、npmで入れたコマンドラインツール(tsc など)です。pnpmは実験的な対応にとどまり、環境変数 VOLTA_FEATURE_PNPM=1 を設定したときだけ有効になります。
グローバルに入れたツールの扱いが、ほかのバージョン管理ツールとの大きな違いです。volta install typescript を実行すると、Voltaは tsc をそのときの既定のNode.jsに紐づけ、Node.jsを上げても勝手に変えません。volta list all の表示で、どの版に紐づいたかを確認できます(以下の出力例はパスを一般的な形に置き換えています)。
runtime [email protected] (current @ ~/work/demo/package.json)
runtime [email protected] (default)
package [email protected] / tsc / [email protected] npm@built-in (default)
プロジェクト内でNode.js 22.23.3が使われていても、tsc はインストール時の既定だった24.22.0で動きます。
shim(volta proxy)がバージョンを振り分ける流れ
macOS・Linuxでは ~/.volta/bin、Windowsの公式インストーラでは C:\Program Files\Volta に置かれる node・npm・yarn は、本物のバイナリではなく volta-shim という中継バイナリです。実行されるたびに、近くの package.json に volta キーがあればその版を、なければ volta install で決めた既定の版を選び、本物のバイナリへ処理を渡します。cd のたびに環境を書き換える方式ではないため、エディタから起動したプロセスでもプロジェクトの版が使われます。
実際にどのバイナリが呼ばれるかは volta which で確かめられます。ダウンロードしたNode.jsの実体は tools/image/node/<版> に、取得したアーカイブは tools/inventory/node に置かれます。
volta which node
# ~/.volta/tools/image/node/24.22.0/bin/node
メンテナンス終了の経緯と影響
2025年11月14日(UTC)、GitHubにissue #2080「Volta is unmaintained; we recommend migrating to mise」が立ち、メンテナーの多くがすでにmiseを使っていると書かれました。同日に公式READMEへ「Volta is unmaintained.」とmiseへの移行推奨が書き込まれ、翌15日に「急いで移行する必要はない」という説明が書き足されています。リポジトリへの最後の変更もこの15日で、アーカイブ(読み取り専用化)はされていません。
注意したいのは、この告知がREADMEにしかない点です。公式サイトの volta.sh にも、使い方を説明する docs.volta.sh にも保守終了の記載はありません。公式サイトの手順だけを見て新しく入れる人が今もいる状態です。
保守終了後に起きている不具合|pnpm 12・npx・tar脆弱性
READMEの「当面動き続ける」は、周辺のツールが変わらない前提の話です。2026年10月21日に、macOS(x86_64)上でVolta 2.0.2を既存環境と分けたディレクトリに入れて試すと、pnpm 12とnpxの2件はその場で再現しました。tarクレートは同梱版を Cargo.lock で確認しています。
| 事象 | 実測結果 | 報告 |
|---|---|---|
| pnpm 12が起動しない | 12.14.0でMODULE_NOT_FOUND | issue #2114 |
| pnpm 10・11 | 10.34.7・11.28.6は起動 | – |
| npxがグローバルツールを見ない | tsc・prettierとも見つからず | issue #2112 |
| tarクレートの脆弱性 | 2.0.2は0.4.38を同梱 | issue #2108 |
pnpm 12がpnpm.cjsを探して止まる
VOLTA_FEATURE_PNPM=1 で volta install pnpm を実行すると12.14.0が入りますが、pnpm -v は次のエラーで終わります。
Error: Cannot find module '~/.volta/tools/image/pnpm/12.14.0/bin/pnpm.cjs'
Voltaは bin/pnpm.cjs を起動しようとします。pnpm 11.28.6までは bin に pnpm.cjs が同梱されていましたが、12では bin にあるのが pnpm.mjs・pnpx.mjs とその起動スクリプトだけになりました。pnpm 12で配布パッケージの構成が変わったことに、Voltaが追随していない状態です。pnpm 12の変更点は pnpmの共有ストアとv12の変更を解説した記事 で扱っています。issue #2114には pnpm.cjs を自作して pnpm.mjs を読み込ませる回避策が書かれていますが、版を上げるたびに作り直しになります。Voltaでpnpmを使い続けるなら volta install pnpm@11 で11系に留めるのが現実的です。グローバルインストールは版に関係なく使えず、pnpm install -g は pnpm global commands is not supported yet. で止まります。
npxがVoltaで入れたツールを見つけない
volta install typescript で入れた tsc はシェルからは動きますが、TypeScriptを依存に持たないディレクトリで npx --no-install tsc -v を実行しても、Voltaの tsc は使われません。npmのキャッシュが空の環境では「npx canceled due to missing packages and no YES option」で止まりました。--no-install を付けないと、npxはレジストリの tsc パッケージ(2.0.4)を取りに行きます。これはTypeScriptではなく、「This is not the tsc command you are looking for」と表示するだけの非推奨パッケージです。volta install prettier で入れたprettier 3.9.10でも同じく見つからず、issue #2112の報告と一致しました。npmスクリプトやドキュメントの手順が npx 前提なら、Voltaで入れたツールは使われず、レジストリからの取得が毎回発生します。npxの解決順は npxとnpm execの違いを解説した記事 で扱っています。
tarクレートのCVE-2026-33056が直らない
2.0.2の Cargo.lock はtarクレートを0.4.38に固定しています。RustSecの勧告 RUSTSEC-2026-0067によれば、0.4.44以前はシンボリックリンクと同名のディレクトリを含むアーカイブを展開すると、展開先の外にあるディレクトリの権限を変えられてしまいます。修正版は0.4.45以降です。issue #2108では、VoltaがNode.jsの展開に使うarchiveクレートのAPIを直接呼んで、この挙動を再現しています。既定の取得先はnodejs.orgなので悪用の条件は限られますが、後述のフックで社内ミラーや第三者のURLを取得先にしている環境では見過ごせません。依存を更新した非公式フォークのv2.0.3(2026年6月3日)も出ていますが、公式の配布物ではありません。
Voltaのインストール手順|macOS・Linux・Windows別
macOS・LinuxでのインストールとPATH設定
公式のインストールスクリプトを1行で実行します。bash・zsh・fishなら起動スクリプトが自動で書き換わり、2.0.0以降のzshでは書き込み先が .zshrc ではなく .zshenv です。macOS向けはIntelとApple Siliconの両方で動くuniversal binaryです。2.0.0でglibcの最低要件が上がり、CentOS 6では動きません。
curl https://get.volta.sh | bash
手で設定する場合は、次の2行を起動スクリプトに加えます。
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
Windowsでのwingetによるインストール
2.0.0でインストーラのコード署名をやめたため、公式はwingetでの導入を推奨しています。2.0.0以降は開発者モードの有効化も不要で、ARM版Windows向けのビルドもあります。WSLの中で使う場合は、Windows版ではなく上のmacOS・Linuxの手順に従います。
winget install Volta.Volta
どのOSでも、新しいターミナルで volta --version を実行し、2.0.2と表示されれば完了です。2.0.2より新しい公式版は無いため、本体を更新する作業もありません。
Node.jsのインストールと切り替え|volta installによる既定版の設定
volta install は「プロジェクト外で使う既定の版」を設定するコマンドで、未取得なら同時にダウンロードします。版を省くと最新のLTSが選ばれます。2026年10月21日時点のLTSは24系(24.22.0)と22系(22.23.3)で、24系は10月20日にメンテナンス期間へ移りました。Node.jsのリリース計画では26系が10月28日にLTSへ入る予定なので、それ以降に版を省くと26系が入ります。LTSの区分と移行時期は Node.js LTSの現行版と移行時期を解説した記事 を参照してください。
volta install node # 最新のLTS
volta install node@24 # 24系の最新(実測で24.22.0、取得込み約10秒)
volta install [email protected] # 版を完全指定
volta install npm # npmの既定版
volta install yarn # Yarnの既定版
Node.jsやnpmを新しい版へ上げたいときも、同じ volta install を新しい版で打ち直します。既定の版が差し替わるだけで、package.jsonで版を固定したプロジェクトには影響しません。一度だけ別の版で動かしたいときは volta run --node 24 node -v のように volta run を使えば、既定の版も固定も変わりません。
volta pinでプロジェクトのNode.jsを固定する方法
package.jsonに書かれるvoltaキー
プロジェクトのディレクトリで volta pin を実行すると、指定した版が完全な版番号に解決されて package.json に書き込まれます。volta pin node@22 を実行した結果は次のとおりです。
{
"name": "demo",
"version": "1.0.0",
"volta": {
"node": "22.23.3"
}
}
このファイルをコミットすれば、Voltaを使う全員がそのディレクトリで同じ版を自動で使います。Voltaを入れていないメンバーには何の効果もありません。volta pin が扱えるのはNode.jsとパッケージマネージャーだけで、依存パッケージの版は npm install などで管理します。
CIでVoltaを入れる必要はありません。GitHub Actionsの actions/setup-node は node-version-file: package.json を指定すると、volta.node、devEngines.runtime、engines.node の順に版を探し、volta.extends の参照先もたどります。入力の詳細は actions/setup-nodeの入力と既定の変更を解説した記事 にまとめています。
モノレポでのextends
1つのリポジトリに複数のパッケージがある場合は、ルートの package.json に版を書き、各パッケージから extends で参照します(Volta 0.8.2以降)。
{
"volta": {
"extends": "../../package.json"
}
}
サブパッケージの中で volta pin を実行すると、ルートではなく最も近い package.json に書き込まれ、そのパッケージだけ版が変わります。全体の版を変えるときは、ルートに移動してから実行します。
Voltaでよく使うコマンド一覧
| コマンド | 用途 | 例 |
|---|---|---|
volta install |
既定の版を設定・取得 | volta install node@24 |
volta pin |
プロジェクトの版を固定 | volta pin node@24 |
volta run |
一度だけ別の版で実行 | volta run --node 22 npm test |
volta list |
現在の版・導入済みツールの表示 | volta list all |
volta which |
実際に呼ばれるバイナリのパス | volta which node |
volta fetch |
既定を変えずに取得だけ行う | volta fetch node@22 |
volta uninstall |
グローバルなツールの削除 | volta uninstall typescript |
volta setup |
PATHの設定をやり直す | volta setup |
volta list は引数なしだと今使われている版を表示し、-d で既定の版、--format plain でスクリプト向けの出力になります。volta run には --node・--npm・--yarn のほか、Node.js同梱のnpmを強制する --bundled-npm、Yarnを外す --no-yarn、環境変数を渡す --env NAME=value があります。版の指定は実行するコマンドより前に書きます。後ろに書いたものはコマンドの引数として扱われます。
プロキシ環境と社内ミラーでの設定
Voltaにはプロキシ専用の設定項目がありません。Volta 2.0.2が使うHTTPクライアントのattohttpc 0.28が、環境変数 HTTP_PROXY・HTTPS_PROXY・ALL_PROXY・NO_PROXY を既定で読むので、Voltaを実行するシェルでこれらを設定します。NO_PROXY に * を入れるとプロキシを使わなくなります。ただしattohttpc 0.28はプロキシ認証のヘッダーを送らないため、URLにユーザー名などを埋め込む認証付きプロキシではNode.jsを取得できません(issue #2090)。
export HTTPS_PROXY="http://proxy.example.co.jp:8080"
volta install node@24
nodejs.orgやnpmレジストリに届かない環境では、フック機能で取得先を社内ミラーへ差し替えます。~/.volta/hooks.json(Windowsは %LOCALAPPDATA%\Volta\hooks.json)に書けば全体に、プロジェクトの .volta/hooks.json に書けばそのプロジェクトだけに効きます。node・npm・yarnごとに、版の一覧(index)、最新版(latest)、配布物のURL(distro)を差し替えられます。前述のtarの脆弱性があるため、取得先は自社で管理するミラーに限ってください。
{
"node": {
"distro": {
"template": "https://mirror.example.co.jp/node/{{os}}/{{arch}}/node-{{version}}.tar.gz"
}
}
}
Voltaのアンインストール手順
Volta本体とシェル設定の削除
macOS・Linuxでは、~/.volta ディレクトリを丸ごと消し、起動スクリプトからVoltaの2行(VOLTA_HOME と PATH)を削除します。対象になりうるファイルは .bashrc・.bash_profile・.zshrc・.zshenv・config.fish・.profile です。シェルがコマンドの場所を覚えていることがあるため、削除後は新しいターミナルを開きます。
rm -rf ~/.volta
Windowsでは[設定]→[アプリ]の一覧からVoltaを選んでアンインストールします。
古いNode.jsとグローバルツールの個別削除
volta uninstall で消せるのは、グローバルに入れたパッケージ(typescript など)だけです。公式リファレンスは引数の例に node を挙げていますが、2.0.2のソースでは node・npm・yarn の削除が未実装です。実際に volta uninstall node も volta uninstall node@22 も、終了コード1で次のエラーを返しました。
error: Uninstalling node is not supported yet.
不要になったNode.jsは、~/.volta/tools/image/node/<版> のディレクトリと、tools/inventory/node にある同じ版のファイル(node-v22.23.3-darwin-x64.tar.gz と node-v22.23.3-npm)を手で削除します。
nvm・fnm・miseとの違い
| ツール | 実装 | 最新版 | Windows | 版を書く場所 | 保守 |
|---|---|---|---|---|---|
| Volta | Rust | 2.0.2(2024年12月) | 対応 | package.json | 終了 |
| nvm | シェルスクリプト | 0.40.8(2026年9月) | WSL・Git Bash・Cygwin | .nvmrc | 継続 |
| fnm | Rust | 1.39.0(2026年3月) | 対応 | .nvmrc・.node-version・engines | 継続 |
| mise | Rust | 2026.10.17(2026年10月) | 対応 | mise.toml ほか | 継続 |
nvmはシェルの起動時に関数を読み込む方式のため、シェル設定を読まないプロセスでは別途設定が要ります。fnmはNode.jsの版管理に用途を絞ったツール、miseは複数言語の版・環境変数・タスクまで扱うツールで、2026年10月は21日までに17回リリースされています。
Node.jsだけを扱う個人の環境ならfnm、複数言語を扱うチームやVoltaのメンテナーと同じ道を選ぶならmiseです。グローバルツールをインストール時のNode.jsに固定するVolta固有の挙動は、どちらにも標準では備わっていません。miseの設定ファイルやタスク機能は miseの導入手順を解説した記事 で詳しく扱っています。
Voltaからmiseへ移行する手順
移行時の設定差分|miseのvoltaキー非対応
miseは package.json の volta キーを読みません。volta キーと devEngines.runtime を併記したプロジェクトでも、既定の設定のままでは mise current node で版が決まらず、警告だけが出ます。
mise WARN Plugin node does not have a version set
miseが既定で読むのは mise.toml と .tool-versions で、.nvmrc・.node-version・package.json の devEngines.runtime は、設定で有効にしたときだけ読みます。engines.node は「動作する版の範囲」を表すものなので読まない、とmiseの公式ドキュメントに書かれています。次の設定を入れると、同じプロジェクトで devEngines.runtime の24.22.0が選ばれました。"^24" のような範囲で書いても、24系の最新に解決されます。
mise settings add idiomatic_version_file_enable_tools node
mise current node
# 24.22.0
voltaキーとdevEnginesの版をそろえる
package.jsonに版を残すなら、devEngines.runtime に書くと手戻りが少なく済みます。miseとsetup-nodeの両方がこのフィールドを読むためです。移行期間中に volta キーと並べて書くときは、版をそろえてください。volta キーが22.23.3、devEngines.runtime が24.22.0のプロジェクトでは、Volta利用者の手元でnpm(10.9.9)が次のエラーを出し、npm install も npm run も終了コード1で止まりました。
npm error code EBADDEVENGINES
npm error EBADDEVENGINES Invalid semver version "24.22.0" does not match "v22.23.3" for "runtime"
npmは devEngines の不一致を既定でエラーとして扱います。不一致を警告にとどめたい場合は "onFail": "warn" を加えます。この設定で同じ npm install は警告を出したうえで完了しました。setup-nodeは両方あると volta.node を優先するため、ずれたままだとCIとmiseで版が割れます。版をそろえた後は onFail を外して構いません。
{
"volta": { "node": "22.23.3" },
"devEngines": {
"runtime": { "name": "node", "version": "24.22.0", "onFail": "warn" }
}
}
miseの有効化・版設定とVoltaの撤去手順
- miseを入れる。macOSなら
brew install mise、Windowsならwinget install jdx.miseまたはscoop install mise。 - シェルで有効化する。zshなら
echo 'eval "$(mise activate zsh)"' >> ~/.zshrcを実行して新しいターミナルを開く。PowerShellでは、プロファイルに(&mise activate pwsh) | Out-String | Invoke-Expressionを追加する。 - 普段使う版を
mise use -g node@24で設定する。 - 各プロジェクトで、
volta.nodeと同じ版をmise use [email protected](mise.tomlに書かれる)か、上のdevEngines.runtimeで指定する。両方あるときは mise.toml が優先される。 - 削除前に
volta list allの結果を保存し、グローバルツールの名前と版を控えてから、前章の手順でVoltaをアンインストールする。両方がPATHに残ると、PATHの前にある方のnodeが呼ばれて版が食い違う。 - グローバルツールを入れ直す。Voltaの中身は引き継がれないため、
mise use -g npm:typescriptのようにmiseのnpmバックエンドで入れるか、npm install --globalで入れる。
pnpmやYarnを使っていた場合は、移行前の版を控え、CorepackのpackageManager設定かmiseで同じ版を指定します。Node.js 25以降はCorepackが同梱されないため、使い方は corepackの後継コマンドとpnpmの版管理を解説した記事 を参照してください。
リポジトリが多く一斉に書き換えられない場合は、issue #2080で共有されている、mise.tomlのテンプレートから jq で既存の volta キーを読む方法が使えます。
[tools]
node = "{{ exec(command='jq -r .volta.node package.json') }}"
この方法は、そのディレクトリで mise trust を実行するまで動きません。実行前の mise current node は「Config files in … are not trusted.」で終了コード1になり、mise trust の後は volta キーの22.23.3を返しました。チームに配るときは、trustの手順も一緒に伝えてください。
移行を急ぐべきケースと様子見でよいケース
すぐに移行すべきなのは、pnpm 12へ上げる予定があるとき、社内ミラーなどnodejs.org以外から配布物を取っているとき、OSのメジャーアップデートやCIイメージの更新を控えているとき、新しいメンバーの環境構築を予定しているときです。前の2つはすでに壊れている箇所か修正されない脆弱性に、後の2つは壊れたときに直す手段がない場面に当たります。
個人の開発機で、npmかYarnだけを使い、nodejs.orgから取得していて、当面OSを上げる予定もないなら、次にOSを更新する前まで様子を見ても差し支えありません。その場合も、volta キーは残したまま同じ版を devEngines.runtime にも書いておけば、移行した日からmiseが同じ版を使えます。
よくある質問
Voltaはもう使えなくなったのですか?
使えます。2.0.2は今もインストールでき、npm・Yarnでの基本機能は動きます。ただしpnpm 12は起動せず、tarクレートの脆弱性も修正されません。保守が終わったため、新しいOSやツール側の変更で壊れても修正版は出ません。
volta pinの設定はVoltaを入れていない人にも効きますか?
効きません。package.jsonの volta キーを読んで版を切り替えるのはVoltaだけで、miseも読みません。例外はGitHub Actionsの setup-node で、node-version-file: package.json を指定すると volta.node を最初に読みます。
Voltaでpnpmは使えますか?
11系までなら使えます。環境変数 VOLTA_FEATURE_PNPM を 1 にして volta install pnpm@11 を実行します。版を省くと12系が入り、pnpm.cjs が見つからないエラーで起動しません。pnpm install -g はどの版でも未対応です。
volta uninstall nodeでNode.jsを消せないのはなぜですか?
2.0.2では、Node.js・npm・Yarn本体の削除が実装されていないためです。削除したい版は ~/.volta/tools/image/node の下のディレクトリを手で消します。volta uninstall が使えるのは、グローバルに入れたパッケージだけです。
Node.jsのバージョン管理はnvmとVoltaのどちらを選べばよいですか?
2026年に新しく選ぶならどちらでもなく、fnmかmiseです。Voltaは保守が終わっています。nvmはWindowsでもWSL・Git Bash・Cygwinなどで使えますが、PowerShellで直接使いたい場合はfnmかmiseが候補です。macOSやLinuxだけで使い、すでにnvmに慣れているならnvmを続けても問題ありません。