Node.jsをvolta経由でインストールするってどゆこと？？

## 背景
自分はモダンなフロントエンド開発に遅れをとっているちょいとレトロなエンジニアなのですが、最近あるフロントエンド開発プロジェクトにアサインされまして、手始めに環境構築手順を眺めていたら見慣れない一文を発見しました。
```terminal
volta install node@lts
```
説明として**Node.jsはvolta経由でインストールしてね**と記載されておりました。Node.jsをインストールするのはさすがにわかりますが、…volta って何?そもそもNode.jsをインストールするのに、インストーラーを利用する方法以外があったんですかー？お恥ずかしながらどうやらだいぶ知識が不足しているようでございます。。。
頭の中のチンプンカンプンが溜まりすぎましたので、自分なりにvoltaとは何者なのかを調べてみました。

## そもそも volta って何？
voltaは、LinkedInが開発を始めたRust製の「JavaScript のツールマネージャー」です。
[公式サイト: volta.sh](https://volta.sh/)
とっても簡単にいうと、複数バージョンのNode.jsやnpmを、めちゃくちゃ簡単に切り替えられるツールです。WindowsでもmacOSでもLinuxでも共通で使用できて、Node.jsだけじゃなくnpm、pnpm、yarnなどのパッケージマネージャのバージョンまでまとめて面倒を見てくれます。

## 複数バージョンのNodeの必要性
Node.jsを複数プロジェクトで使っていると、例えば「古いプロジェクトはNode.jsのバージョン16、新しいプロジェクトはバージョン20を使わないと動かない」といったことがよくあります。これを1つのPC内で解決するためには、**複数のNode.jsバージョンを使い分けられる仕組み**が必要です。

## インストーラーでNodeを入れた場合との違い
しかし、インストーラー経由（公式MSI）でNode.jsをインストールすると、通常はOS全体で単一のバージョンしか使えません。バージョンを変えるには再インストールする必要があり、複数バージョンを並行して使うことは難しいです。つまり**プロジェクト毎に異なるバージョンを使うことも難しい**ということになります。
また、公式インストーラーでは通常、管理者権限が必要となる「Program Files」などのシステムフォルダにインストールされます。このため、企業のセキュリティポリシーなどで管理者権限がない場合はNode.jsをインストールできません。

一方、voltaを使うと複数バージョンのNode.jsを簡単に共存させられ、**プロジェクト毎に使うバージョンを自動で切り替え可能**になります。これが公式インストーラーとの大きな違いであり、voltaを使う最大のメリットです。また、voltaはユーザーフォルダ内にすべてのファイルをインストールするため、管理者権限がなくても気軽に導入可能です。

## どんな仕組み？
voltaは「シム（shim）」という仕組みを使っています。シムとは簡単に言うと「代理人」や「受付担当」のような小さなプログラムで、実際に実行するNode.jsを適切に選んで呼び出してくれる仕組みのことです。
具体的な動作のイメージは以下のような感じです。

1. nodeコマンドを打つと、まずvoltaのシムが起動
2. 現在のフォルダを見てpackage.jsonの"volta"設定を探す
   * あればそのバージョンを使う
   * なければ最初に設定した既定のバージョンを使う
3. package.jsonで設定したバージョンがなければ、voltaがネットから自動ダウンロードしてキャッシュ

最初にvolta経由でNode.jsをインストールすると、そのバージョンが既定のバージョンとなり、特にプロジェクトを作成しなくても、PCのどこからでもNode.jsのコマンドが実行できるようになります。新しいプロジェクトで特別に設定をしない限り、この規定のバージョンが使われるということです。
**プロジェクトごとにNode.jsを個別インストールしているわけではなく**、各バージョンはPC内に一度だけダウンロードされて再利用されます。

## 【補足】「nvm」と「volta」は何が違う？
nvm（Node Version Manager）は、Node.jsのバージョンを管理する古くからある人気ツールですが、欠点として毎回シェルを起動するたびに手動で`nvm use XX`というコマンドを打つ必要があります。
それに対してvoltaは、ディレクトリごとに使用するNode.jsのバージョンを自動で判断してくれます。設定を一度行えばその後の操作は不要なので、使い勝手が非常に良いといえます。

## 【補足】Visual Studioの「Node.js開発」ワークロードには注意が必要
voltaとは直接関係はありませんが、Node.jsのインストールに関連する備忘メモとして記載しておきます。
Visual Studioをインストールする際、ワークロードとして「Node.js 開発」を選択することができます。こちらを選択するとVisual Studioインストール時にNode.jsもインストールされることになりますが、このインストールは公式インストーラーを利用した場合とは状態が違いますので注意してください。
| インストール元                  | 実際に入るもの                                                              | 置かれる場所                                                                               | PATH への登録           |
| ------------------------ | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------- |
| **公式 Node.js MSI**       | Node.exe 本体 + npm + core-modules                                     | `C:\Program Files\nodejs`                                                            | あり（全ユーザー）           |
| **VS「Node.js 開発」ワークロード** | *① テンプレート & デバッガ*<br>*② Visual Studio 内部で使う**私的な Node.exe**（古い事が多い）* | 例：`C:\Program Files\Microsoft Visual Studio\2022\Community\…\NodeJs\node64\node.exe` | **なし**（外部ツールから見えない） |

コミュニティでも「VS が入れる Node は IDE 内部用なので普段使いしない方がいい」と指摘されています。 
[Why can't Visual Studio find the Node.js runtime installed by the Visual Studio Installer?](https://stackoverflow.com/questions/69150816/why-cant-visual-studio-find-the-node-js-runtime-installed-by-the-visual-studio)
よって、Node.js は別途インストールしてあげたほうが良いです。その場合の挙動は以下のような感じです。
1. プロジェクトを開くと Visual Studio はまず OS に見える Node.exe を探す
   * 公式 MSI ／ Volta で入っていればそれを使う
   * 見つからなければ 自前フォルダーの Node.exe を暫定的に使う
2. CLI（PowerShell／ターミナル）から node コマンドを実行する
   * PATH にある公式 MSI／Volta／nvm 版が起動
   * Visual Studio 付属の Node は PATH に無いので呼び出されない

ワークロードとして「Node.js 開発」を選択したとしても、Volta やインストーラーを利用してNode.jsは必ずインストールしておくことが大事とのことです。ワークロード「Node.js 開発」を選択するのは、テンプレートとデバッガ を導入するためと割り切りましょう。

## まとめ
voltaを使うメリットを簡単にまとめると以下のとおりです。
* **プロジェクト毎に異なるバージョンのNode.jsを使用できる**  
  プロジェクトを切り替えれば自動で正しいNode.jsバージョンに切り替わるため、バージョン切り替え忘れによるビルドエラーが起こる心配がない。
  
* **CI環境やチームで環境を揃えられる**  
  voltaを使えば、誰が環境をセットアップしても同じNode.js環境を簡単に再現できる。

* **管理者権限がないPCでもNode.jsを利用できる**  
  voltaはユーザーフォルダ内で完結するため、管理者権限が不要で気軽に導入できる。


今回、volta とは何か、利用するメリットとは何かを調べてみました。今のところは使わない手はない！という印象でおります。
もし誤って理解している部分等ありましたらご指摘いただけると助かります！
Webフロントエンド開発はトレンドの移り変わりが早いので、これからも頑張ってついていこうと思ったのでした。

以上でっす！

## 参考
[volta.sh（公式サイト）](https://volta.sh/)
[Node のバージョン管理は Volta でいいかな](https://blog1.mammb.com/entry/2021/11/01/090000)
[Voltaで超楽にNode.jsバージョン管理したい](https://zenn.dev/json_hardcoder/articles/1c102f2d5511e3)
[Why can't Visual Studio find the Node.js runtime installed by the Visual Studio Installer?](https://stackoverflow.com/questions/69150816/why-cant-visual-studio-find-the-node-js-runtime-installed-by-the-visual-studio)