2025年11月、Volta のリポジトリに Volta is unmaintained; we recommend migrating to mise(Issue #2080)という Issue が立ちました。メンテナ自身によるアナウンスで、内容はおおむね次のとおりです。
The volta maintainers recommend using
mise. It is the tool that most of them use nowadays.
あわせて「今動いているものは当面動き続けるので緊急の移行は不要。ただし新しい OS リリースやエコシステムの変化で壊れても対応できないので、いずれ移行のロードマップに入れてほしい」という趣旨のことも書かれています。
つまり今すぐ壊れる話ではないのですが、この手の「いつかやる」は永遠にやらないので、まだ動いているうちに移行することにしました。やることは4ステップです。
mise.toml に置き換える先に何を入れていたかを控えておきます。あとで mise 側に入れ直すためです。
volta list allVolta の公式ドキュメントにあるアンインストール手順は、ディレクトリの削除とシェル設定の2行削除だけです。
rm -rf ~/.volta.zshrc から Volta 関連の2行を消します。
# ~/.zshrcexport VOLTA_HOME="$HOME/.volta" # [!code --]export PATH="$VOLTA_HOME/bin:$PATH" # [!code --]⚠️ ターミナルは開き直す
シェルはコマンドの場所をキャッシュしているので、削除後も node が生きているように見えることがあります。新しいターミナルを開いて which node が空になることを確認しておくと安心です。
Homebrew で入れて、activate の記述を .zshrc に追加します。
brew install miseecho 'eval "$(mise activate zsh)"' >> ~/.zshrcexec $SHELL -l設定が正しいかは doctor で確認できます。
mise doctor🛠 エディタからも解決させたいならshimsにPATHを通す
mise activate は対話シェル向けのしくみで、PATH を動的に書き換えることでバージョンを切り替えています。そのためターミナル以外から起動されたプロセス(エディタの拡張機能やGUIアプリなど)からはインストールしたコマンドが見つからないことがあります。
その対策として、shims にもパスを通しておきます。
echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.zshrcshims は mise activate の全機能をカバーするわけではないので、あくまで「activate が効かない場所のためのフォールバック」という位置づけです。対話シェルでは activate 側が優先されます。
Volta では volta install node@22 でグローバルのバージョンを決めていました。mise では use に -g(グローバル)を付けます。
mise use -g node@latestmise use -g pnpm@11.20.0実行すると ~/.config/mise/config.toml が書き換わります。
# ~/.config/mise/config.toml[tools]node = "latest"pnpm = "11.20.0"use は「プラグインのインストール」「指定バージョンのインストール」「アクティベート」を一発でやってくれるコマンドです。Volta の volta install とほぼ同じ感覚で使えます。
グローバルの npm パッケージ(volta install typescript のように入れていたもの)は、npm バックエンドを使って mise 管理下に置けます。
mise use -g npm:typescript👉 ポイント
~/.default-npm-packages を読ませる方法もありますが、こちらは deprecated 扱いになっているので npm: バックエンドで書くほうが無難です。
ここが移行で一番ハマったところです。
⚠️ mise は package.json の volta フィールドを読まない
Volta はプロジェクトのバージョンを package.json に書きます。
// package.json{ "volta": { "node": "22.15.0", "pnpm": "10.11.0" }}この記述は mise からは完全に無視されます。移行後もリポジトリに残っていると「バージョン指定してあるのに効かない」と混乱するので、mise.toml に置き換えます。
mise use node@22.15.0 pnpm@10.11.0-g を付けずに実行すると、そのディレクトリに mise.toml が作られます。
# mise.toml[tools]node = "22.15.0"pnpm = "10.11.0"このファイルをリポジトリにコミットしておけば、他のメンバーは次のコマンドで足りていないツールをまとめてインストールできます。Volta にはなかった動きで、地味に便利でした。
mise installなお .node-version や .nvmrc に対応させたい場合は、明示的な有効化が必要です(デフォルトは無効)。
mise settings add idiomatic_version_file_enable_tools nodeチーム内に Volta を使い続けている人がいるなら、volta フィールドを残したまま mise.toml を足しておけば両方動きます。移行期間はこの二重持ちでしのぎました。
移行してみて感じたちがいをまとめます。
| 観点 | Volta | mise |
|---|---|---|
| 管理対象 | Node.js / npm / yarn / pnpm | 各種言語ランタイム・開発ツール(700以上) |
| プロジェクト指定 | package.json の volta フィールド | mise.toml |
| バージョン切り替え | shim | PATH の動的書き換え(+shims) |
| 設定からの一括インストール | なし | mise install |
| 他ツールの設定ファイル | — | .tool-versions / .nvmrc / .node-version に対応(後者2つは要有効化) |
| メンテナンス状況 | 2025年11月にメンテナンス終了 | 活発 |
コマンドの対応はこうなります。
| やりたいこと | Volta | mise |
|---|---|---|
| グローバルのバージョン指定 | volta install node@22 | mise use -g node@22 |
| プロジェクトのバージョン固定 | volta pin node@22 | mise use node@22 |
| インストール済み一覧 | volta list | mise ls |
| グローバルnpmパッケージ | volta install typescript | mise use -g npm:typescript |
| 設定ファイルから一括で入れる | — | mise install |
いちばん効いたのは管理対象の広さでした。Node.js しか扱えなかったところが、pnpm も、必要になれば Go や Python も同じツールで面倒を見られるようになります。ツールごとにバージョンマネージャを覚えなくてよくなったのは、思っていたより快適です。
「使っているツールの開発が止まる」という経験は初めてだったのですが、公式が移行先を名指ししてくれていたおかげで迷わずに済みました。作業自体は30分ほどで終わっています。
ハマりどころは package.json の volta フィールドが読まれない点だけで、そこさえ mise.toml に置き換えてしまえば、あとは Volta とほぼ同じ感覚で使えます。
Volta を使っているプロジェクトは世の中にまだ多いと思うので、壊れてから慌てる前に、動いているうちに移しておくのがおすすめです。