Nodeバージョン管理ツールをNodistからVoltaに移行してみた

今までNodeのバージョン管理ツールにはNodistを使っていたのですが、Nodistは2019年以降更新が無い状態です。

また、2020年12月に新しい管理ツールである[Volta](https://volta.sh/)がリリースされました。

そこで、この記事ではNodeバージョン管理ツールをNodistからVoltaへ移行する手順と、Voltaの主要な機能をご紹介します。

### はじめに
* この記事では、Windows 10での動作を前提としています。
* この記事で記載されている手順およびバージョンは2022年1月時点のものです。

### NodistからVoltaへの移行

#### Nodistのアンインストール
Voltaのインストールの前に、Nodistをアンインストールします。感謝！

Nodistをアンインストールするには単純にプログラムのアンインストールをするだけでは足りず、一部フォルダや環境変数も削除する必要があります。

1. 「プログラムと機能」からNodistをアンインストール
1. いくつか残っているNodist関連フォルダやファイルを削除

    残っているフォルダやファイルが悪さしないよう、`Shift + Delete`で完全削除してしまったほうが無難です。

    ※以下のパスはNodistをデフォルトでインストールした際のものです。
    1. Nodist
        ```
        C:\Program Files (x86)\Nodist
        ```
    1. npm-cache
        ```
        C:\Users\(Username)\AppData\Roaming\npm-cache
        ```
    1. .npmrc
        ```
        C:\Users\(Username)\.npmrc
        ```
1. 環境変数を削除
    1. ユーザー環境変数「Path」およびシステム環境変数にNodeやNodistのパスがあれば削除
    
        **※Path等の環境変数自体の削除は行わないでください。**

1. アンインストールの最終確認

    下記のようなNodistやnodeのコマンドを実行し、コマンドが存在しないエラーが表示されるか確認します。
    ```
    > nodist

    > node -v
    ```

#### Voltaのインストール
1. インストーラーのダウンロード
    
    Volta公式の下記のページから「download and run the Windows installer」のリンクからインストーラーをダウンロードします。

    https://docs.volta.sh/guide/getting-started
    ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/f88072ae-4e80-0b69-9ac1-6f3ce59d29dc.png)

1. インストーラーを起動して、Voltaをインストール

1. 開発者モードの有効化

    上記のVolta公式ページでも記載されているように、VoltaをWindowsで動作させる場合は「開発者モード」を有効化することを推奨しています。

    開発者モードを有効化するにはWindowsの「開発者向け設定」から行います。
    ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/7d5268b2-df56-2543-acbe-c1a5eb378986.png)

1. Voltaインストール完了の確認

    下記のコマンドを実行し、Voltaがインストールされているか確認します。

    バージョンが表示されれば成功です。

    ```
    > volta -v
    1.0.5
    ```

#### Nodeインストール、バージョン切り替え


下記のコマンドを実行すると、Nodeがインストールされます。デフォルトでは最新の安定版がインストールされるようです。
```
> volta install node
success: installed and set node@16.13.2 (with npm@8.1.2) as default
```
参考：https://docs.volta.sh/reference/install


Nodeやnpmのバージョンを確認すると、該当バージョンがインストールされていることがわかります。

```
> node -v
v16.13.2

> npm -v
8.1.2
```

また、バージョンを指定したい場合は、`volta install node@{バージョン}`と実行します。
```
> volta install node@14.15.4
success: installed and set node@14.15.4 (with npm@6.14.10) as default
```

また、既に該当バージョンのNodeがインストール済みであっても、バージョンの切り替えは`install node`で行います。

Nodistでは`nodist add vx.x.x`や`nodist vx.x.x`といったコマンドがVoltaでは`install node`で完結するということです。

ここでポイントとなるのが、**nodeのバージョンを切り替えると自動的にnpmのバージョンも変わってくれる点**です。

Nodistの時はNodeを切り替えるたびに`npm match`を行う必要がありましたが、Voltaの場合は`install node`だけでnpmのバージョンごと切り替わってくれるのでとても楽です。

##### インストール済みのNodeバージョン確認

現在インストール済みのNodeの一覧を確認するには`volta list node`コマンドを実行します。

Nodistでいうところの`nodist`コマンド相当の機能がこちらになります。

```
> volta list node
⚡️ Node runtimes in your toolchain:

    v12.13.1
    v14.15.4 (default)
    v16.13.1
    v16.13.2
```

##### 【補足】npmライブラリのグローバルインストール
前述のNodistのアンインストールでnpm cache等も完全に削除したため、npmからグローバルインストールしたライブラリはVoltaおよびNodeのインストール後に再インストールする必要があります。


### プロジェクトのNodeバージョン固定
ここで、Voltaの強力な機能を1つご紹介します。

VoltaではプロジェクトのNodeやnpmバージョンを固定させることができます。

参考：https://docs.volta.sh/guide/understanding#managing-your-project

固定化のやり方は簡単で、プロジェクト直下で`volta pin`コマンドを実行するだけです。


現在`v16.13.2`をインストールしている状態でプロジェクトのパスに移動し、`v14.15.4`のバージョンを指定してみます。

```
> node -v
v16.13.2

> npm -v
8.1.2

> cd (プロジェクトフォルダ)

(プロジェクトフォルダ)> volta pin node@14.15.4
success: pinned node@14.15.4 (with npm@6.14.10) in package.json
```

実行後、プロジェクトのpackage.jsonにこのような設定が追記されていることが確認できます。
```json
  "volta": {
    "node": "14.15.4"
  }
```

ここで、プロジェクト直下でNodeとnpmのバージョンを確認すると、対応するバージョンとなっていることが確認できます。

```
(プロジェクトフォルダ)> node -v
v14.15.4

(プロジェクトフォルダ)> npm -v
6.14.10
```

このプロジェクトフォルダから離脱すると、現在のNodeバージョンに自動で戻っていることが確認できます。
```
(プロジェクトフォルダ)> cd ..

> node -v
v16.13.2

> npm -v
8.1.2
```

この`volta pin`を行うことで、**VoltaさえインストールしていればNodeやnpmのバージョンがプロジェクトに対応したものに自動的に切り替わってくれます**。


### まとめ
この記事ではNodistからVoltaへの移行手順と、Voltaの主要な機能をご紹介しました。

実際に私もプロジェクトごとに異なるNodeバージョンを利用しており、今までは作業するプロジェクトを変えるたびにNodeやnpmのバージョンを切り替える必要があったのですが、Voltaに移行したことでその手間が一気に楽になりました。

そのためVoltaは大人数で開発しているプロジェクトや、複数プロジェクトを掛け持ちしている場合、特に効果的に活用できるツールとなると思います！