Node.js のバージョン管理を fnm から Volta に乗り換えました（Windows）

Node.js のバージョン管理は fnm (Fast Node Manager) を利用していましたが、

* シェルセットアップが面倒…:pensive:
* コマンドプロンプトで利用できない…:confounded:

という不満がありました。

ちなみに、fnm のインストール方法と使い方については以前投稿しました。

https://qiita.com/taqumo/items/b25d486e6ead9f38a13d

そんな中、以下記事と出会い、Volta が良さげ:smirk:

https://zenn.dev/aiueda/articles/7dcecaa05d4f24#%E6%97%A2%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bnode.js%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

:::note info
:bulb: **Volta のオススメポイント**

* インストールが簡単
* コマンドプロンプトで利用可能
* OS に関係なく利用可能
* Node に加え、パッケージマネージャー(npm, yarn)とグローバルパッケージも管理
* プロジェクトで利用するツールを `package.json` で管理
* プロジェクトごとに自動でバージョン変更
:::

というわけで、乗り換えることにしました！

## :fire: fnm のアンインストール

### 1. Chocolatey で fnm をアンインストール

fnm は Chocolatey でインストールしていたので Chocolatey GUI 、またはコマンドを入力してアンインストールします。

![volta_fnm_uninstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/afd6fd7c-a892-3b17-89f8-565d20e59eec.png)

```shell
choco uninstall fnm
```

### 2. PowerShell 設定ファイルの削除

fnm を PowerShell で利用するために必要だったプロファイルファイル、`Microsoft.PowerShell_profile.ps1` を削除します。
ファイルの場所は以下となります。

* Windows PowerShell
  `C:\Users\[ユーザー名]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1`
* PowerShell
  `C:\Users\[ユーザー名]\Documents\PowerShell\Microsoft.PowerShell_profile.ps1`

### 3. fnm ファイルの削除

fnm で利用していたファイルが以下に格納されているので、削除します。

`C:\Users\[ユーザー名]\AppData\Roaming\fnm`

### 4. Windows の再起動

Windows を再起動します。

:::note warn
再起動しないと、PowerShell で Volta コマンドが認識されませんでした。
:::

## :zap: Volta のインストール

### 1. 開発者モードを有効にする

公式サイトに以下の記載があります。

:::note warn
注意
Volta の機能はシンボリックリンクの作成に依存しているので、どちらかが必要です。

* 開発者モードを有効にする（推奨）
* 昇格した特権で Volta を実行する（非推奨）
:::

https://docs.volta.sh/guide/getting-started

というわけで、開発者モードを有効にしておきます。

`開発者` で検索し、`開く` をクリック。

![volta_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/7f4313ab-10b6-1719-c98b-3bf1e8ef1318.png)

`開発者モード` を `オン` に変更。

![volta_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/61b591bd-ca02-981a-3234-95f4206e6bc8.png)

警告ウィンドウが表示されたら `はい` をクリック。

![volta_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/2ab27f5f-e039-5933-b3de-73373f679f52.png)

### 2. Chocolatey で Volta をインストール

Chocolatey GUI または、コマンドを入力してインストールします。

![volta_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/8a237117-bd4a-96ab-6afc-159194512e60.png)

```shell
choco install volta
```

### 3. インストールの確認

正常にインストールできたか確認します。
以下コマンドを実行し、バージョン番号が表示されればインストールは終了です:ok_hand:

```shell
volta -v
> 1.1.0
```

## :beginner: Volta の使い方

よく利用しそうなコマンドを紹介します。

### コマンドリファレンス

https://docs.volta.sh/reference/

```shell
volta
```

### インストール

https://docs.volta.sh/reference/install

#### Node.js

```shell
# 安定版
volta install node
# 最新版
volta install node@latest
# バージョン指定
volta install node@{version}
```

#### パッケージマネージャ

```shell
# 最新版
volta install npm
volta install yarn
# バージョン指定
volta install npm@{version}
volta install yarn@{version}
```

#### グローバルパッケージ

```shell
# 最新版
volta install {package}
# バージョン指定
volta install {package}@{version}
```

:::note warn
グローバルバッケージはバージョン管理されず、最後にインストールしたバージョンが適用されます。
:::

### アンインストール

https://docs.volta.sh/reference/uninstall

#### Node.js

`volta uninstall node` で削除できそうですが、できません…:sweat:
以下ファイルを手動で削除するしかないようです。

* 本体
  `%LOCALAPPDATA%\Volta\tools\image\node\{バージョン}`
* キャッシュ
  `%LOCALAPPDATA%\Volta\tools\inventory\node\{バージョン}`

#### パッケージマネージャ

`volta uninstall npm` `volta uninstall yarn` で削除できそうですが、できません…:sweat:
以下ファイルを手動で削除するしかないようです。

* 本体
  `%LOCALAPPDATA%\Volta\tools\image\npm\{バージョン}`
  `%LOCALAPPDATA%\Volta\tools\image\yarn\{バージョン}`
* キャッシュ
  `%LOCALAPPDATA%\Volta\tools\inventory\npm\{バージョン}`
  `%LOCALAPPDATA%\Volta\tools\inventory\yarn\{バージョン}`

#### グローバルパッケージ

グローバルパッケージは以下コマンドで削除できます。

```shell
volta uninstall {package}
```

### プロジェクトでバージョンを固定する

https://docs.volta.sh/reference/pin

以下コマンドを入力すると `package.json` に Volta の設定情報が追加されます。

fnm の場合は `.node-version` が作成されていました。
ルートに余計なファイルが作成されないのは嬉しい:smile:

```shell
# Node.js のバージョンを固定
volta pin node@18.18.0
```

```json:package.json
"volta": {
  "node": "18.18.0"
}
```

:::note info
npm は固定した Node のバージョンに合わせて、ローカルに自動的にインストールされるようです。
npm のバージョン固定は必要ないと思います。
:::

### バージョンを確認する

https://docs.volta.sh/reference/list

#### 使用中のバージョン


```shell
# 現在使用しているツールのバージョンを表示する
volta list
# 現在使用している Node.js のバージョンを表示する
volta list node -c
# 現在使用している npm のバージョンを表示する
volta list npm -c
# 現在使用している yarn のバージョンを表示する
volta list yarn -c
```

#### インストールしているバージョン

```shell
# インストールしているツールのバージョンを表示する
volta list all
# インストールしている Node.js のバージョンを表示する
volta list node
# インストールしている npm のバージョンを表示する
volta list npm
# インストールしている yarn のバージョンを表示する
volta list yarn
```