Voltaって結局何がすごいん！？

# きっかけ
Nodeのバージョン管理を選定するにあたり、Voltaについて調べたので、そのことをまとめておきます。

# Voltaのここがすごい！
Voltaは以下の3点において優れています。
①速い
②堅実
③ユニバーサル

詳しくみていきましょう。

### ①速い
Volta は Rust 製であるため、他のバージョン管理ツールより動作が高速です。


### ②堅実
Voltaはバージョンを固定することができます。

package.jsonに記録されていて、共同開発者がgitからインストールするとその固定されたバージョンがインストールされ、プロジェクト単位での切り替えを自動で行なってくれます。

ただし、共同開発者がVoltaをインストールしている場合に限ります。

### ③ユニバーサル
Windows・Mac・Linux。どの OS でも作動します。



# バージョンの固定って何？？
①、③については説明は特に必要ないかと思うので、以下では②について詳しく掘り下げていきます。

volta pinコマンドを使用することで、各プロジェクトディレクトリ内でNodeとnpm(パッケージマネージャー)のバージョンを固定できます。

### Nodeのバージョンを固定
```:Terminal
$ volta pin node@14.17
```
### npmのバージョンを固定
```:Terminal
$ volta pin npm@6.14
```
そしてその切り替えを自動で行なってくれるのです。

# グローバルvsローカル
ここでは、Voltaにおいてグローバルとローカル、どっちが優先されるのかについて話していきます。

## Case1: Nodeの場合
結論から言うと、ローカルが優先されます。
基本的にはデフォルト(グローバル)のNodeのバージョンが使用されるのですが、プロジェクトディレクトリ内において、指定がある場合は、そちらが優先されます。

## Case2: npmパッケージの場合
こちらも結論から言うと、ローカルが優先されます。

typescriptを例にして説明します。

TypeScript がグローバルインストールしてあったとします。
※npm や yarn でグローバルインストールしても Volta 管理下になる
```shell:Terminal
$ volta install typescript
or
$ npm install -g typescript
or
$ yarn global add typescript

$ tsc --version # 4.4.4
```
しかし、後々、とあるプロジェクトでは違うバージョンをローカルでインストールしていた場合、
そのプロジェクトに移動した際には、ローカルバージョンが自動的に使われます。
```shell:Terminal
$ cd /path/to/project-using-typescript-3.9.4
$ tsc --version # 3.9.4
```
ちなみに、グローバルインストールした npm パッケージは、インストール時のデフォルトバージョンである Node.js と関連付けられます。

npm パッケージを、グローバルバージョンとして使用する際は、この関連付けられた Node.js が使われるようになっているようです。
```shell:Terminal
$ volta list all
⚡️ User toolchain:
    .
    .
    .
    Packages:
        typescript@4.4.4 (default)
            binary tools: tsc, tsserver
            platform:
                runtime: node@16.13.0
```
# それぞれのインストール方法
Voltaを使ってみたくなってきたでしょうか。
では、以下の3つのインストール方法について以下で解説します。
* Voltaのインストール
* Nodeのインストール
* パッケージマネージャーのインストール

## Voltaのインストール
それでは Volta をインストールしましょう。
手順は以下の2つです。

* Nodeバージョン管理ツールの削除
* Voltaのインストール

### Nodeバージョン管理ツールの削除
Voltaをインストールする前に、現在使用中のNodeバージョン管理ツールを削除してください。

使用するツールによって削除方法が異なるので、各々使用しているツールに応じて調べてみてください。


### Voltaのインストール
[公式](https://docs.volta.sh/guide/)のドキュメントに従い、インストールを行います。
Mac・Linux（WSL 含む）であれば、以下のコマンドで簡単にインストール可能です。

以下のコマンドを実行しましょう。

```:Terminal
$ curl https://get.volta.sh | bash
```
bashとなっていますが、zsh・fish を使用されている方でも問題なくインストール可能です。
自動でパスも通してくれます。

## Nodeのインストール方法
特定のバージョンをインストールする場合は以下のコマンドを実行します。
```:Terminal
$ volta install node@14.15.5
```

正確なバージョンを指定しなかった場合は、Volta はリクエストに一致する適切なバージョンを選択します。
```shell:Terminal
# 14系の安定版がインストールされる
$ volta install node@14
```
@latestで最新版をインストールできます。

```shell:Terminal
# 最新バージョンをインストールする
$ volta install node@latest
```
バージョンを完全に省略すると、Volta は最新の LTS リリースを選択しインストールします。
```shell:Terminal
# NodeのLTSリリースがインストールされる
$ volta install node
```

## パッケージマネージャー（npm、yarn）のインストール

パッケージマネージャーのインストールを行う場合は、以下のコマンドを実行してください。
```:Terminal
volta install npm
```
```:Terminal
volta install yarn
```
インストールは、選択したノードのデフォルトバージョンを使用して実行されます。


# Volta のコマンドについて
最後に、Voltaのコマンド一覧を置いておきます。（[公式コマンドリファレンスはこちら](https://docs.volta.sh/reference/)）
```shell
# 利用方法
volta [FLAGS] [SUBCOMMAND]
# FLAGS
    --verbose   # 詳細な診断を有効にします
    --quiet     # 不要な出力を防ぎます
-v, --version   # Voltaの現在のバージョンを表示します
-h, --help      # ヘルプ情報を表示します


# SUBCOMMANDS
fetch          # ローカルマシンにツールをフェッチ（取り込み）します
install        # ツールをツールチェーンにインストールします
uninstall      # ツールをツールチェーンからアンインストールします
pin            # プロジェクトのランタイムやパッケージマネージャーを固定します
list           # カレントツールチェーンを表示します
completions    # Voltaコンプリートを生成します
which          # Voltaが呼び出す実際のバイナリを特定します
setup          # 現在のユーザー/シェルに対してVoltaを有効にします
help           # メッセージまたは指定されたサブコマンドのヘルプを表示します
```
## volta list
中でもよく使うコマンドであるvolta listについてご紹介します。

volta listは、Node ランタイム、パッケージマネージャーおよびバイナリを含むパッケージを検査し表示してくれるものです。
使い方はvolta list [FLAGS] [OPTIONS] [tool]です。

以下にvolta listコマンドの使い方をまとめます。
```shell
# 利用方法
volta list [FLAGS] [OPTIONS] [tool]

# Flags
-c, --current # 現在のアクティブなツールを表示します
              # このフラッグがデフォルトです
-d, --default # デフォルトツールを表示します
    --verbose # 詳細な診断を有効にします
    --quiet   # 不要な表示を防ぎます
-h, --help    # ヘルプ情報を表示します

# OPTIONS
--format <format>   # 出力形式を指定します
                    # 有効な値は `human` or `plain` です
                    # デフォルトは `human` で、それ以外の場合は `plain` です

# ARGS
<tool>  # リスト表示したいツールを指定します（node, npm, yarn またはその他のバイナリ）
        # 全て表示したい場合は `all` を指定します
```

この中でよく使うのは、シンプルなvolta list、volta list allです。

volta listは、そのプロジェクトで使用されるツールのバージョンを確認してくれます。
volta list allは、Volta で管理しているツールを一覧で見ることができます。