【NVM】人気のNode.jsバージョン管理ツール

# はじめに
Node.jsのバージョン管理には苦労した経験がある方も多いのではないでしょうか。私もその一人です。

`nodenv`を使用してNode.jsのバージョンを切り替えようと `nodenv local v22.15.0` を実行したのに、バージョンが切り替わらない...調べてみると、なんと`nodebrew`というツールもインストールされていて、PATHの設定でnodenvより先にnodebrewが読み込まれていたのです。

この問題を解決した後、「もっと良いNode.jsバージョン管理ツールはないのか？」と調査したところ、nvmというツールがGitHubで圧倒的なスター数（84.3k）を獲得していることを発見しました。nodenvの2.3kと比べると、その差は歴然です。

そこで今回は、Node.jsバージョン管理ツールの王者(仮)「**nvm (Node Version Manager)**」について詳しく解説します。

# nvmとは？

nvmは、Node Version Managerの略で、複数のNode.jsバージョンを簡単に管理するためのコマンドラインツールです。GitHubでは84.3k以上のスターを獲得しており、Node.jsバージョン管理ツールの中では圧倒的な人気を誇ります。

nvmの主な特徴
- POSIXに準拠したシェル（bash、zsh、kshなど）で動作
- Unix、macOS、Windows WSLで利用可能
- シンプルなコマンドで複数のNode.jsバージョンを切り替え可能

# nvmのインストール方法

### 基本的なインストール方法

nvmをインストールするには、以下のコマンドを実行します

```bash
# curlを使う場合
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# wgetを使う場合
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# Homebrewを使う場合（推奨されていないようです）
brew install nvm
```

このスクリプトは、nvmリポジトリを`~/.nvm`にクローンし、適切なプロファイルファイル（`~/.bashrc`、`~/.bash_profile`、`~/.zshrc`、または`~/.profile`）に以下のコードを追加します。

```bash
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
```

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

インストールが成功したかどうかを確認するには

```bash
command -v nvm
```

このコマンドが`nvm`を出力すれば、インストールは成功しています。

## nvmの基本的な使い方

### Node.jsのインストール

```bash
# 最新版のNode.jsをインストール
nvm install node

# 特定のバージョンをインストール
nvm install 14.17.0

# LTS版をインストール
nvm install --lts
```

### バージョンの切り替え

```bash
# 特定のバージョンに切り替え
nvm use 14.17.0

# 最新版に切り替え
nvm use node

# LTS版に切り替え
nvm use --lts
```

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

```bash
nvm ls
```

### インストール可能なバージョンの確認

```bash
nvm ls-remote
```

### デフォルトバージョンの設定

```bash
nvm alias default 14.17.0
```

## プロジェクト固有のNode.jsバージョン

プロジェクトごとに異なるNode.jsバージョンを指定したい場合は、`.nvmrc`ファイルを使用します。

```bash
# プロジェクトのルートディレクトリに.nvmrcファイルを作成
echo "14.17.0" > .nvmrc

# または最新のLTS版を使用する場合
echo "lts/*" > .nvmrc
```

そして、プロジェクトディレクトリで以下のコマンドを実行するだけです

```bash
nvm use
```

nvmは`.nvmrc`ファイルを自動的に検出し、指定されたバージョンに切り替えます。

## ディレクトリによる自動切り替え

ディレクトリを移動するたびに自動的に適切なNode.jsバージョンに切り替えるように設定することもできます。

### Bashの場合

```bash
# ~/.bashrcに追加
cdnvm() {
    command cd "$@" || return $?
    nvm_path="$(nvm_find_up .nvmrc | command tr -d '\n')"

    if [[ -s "$nvm_path/.nvmrc" ]]; then
        nvm use
    elif [[ $(nvm current) != $(nvm version default) ]]; then
        echo "Reverting to nvm default version"
        nvm use default
    fi
}
alias cd='cdnvm'
```

### Zshの場合

```zsh
# ~/.zshrcに追加
autoload -U add-zsh-hook

load-nvmrc() {
  local nvmrc_path
  nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    nvm use
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc
```

## nvmの高度な使い方

### グローバルパッケージの移行

新しいNode.jsバージョンをインストールする際に、以前のバージョンからnpmパッケージを移行できます

```bash
nvm install --reinstall-packages-from=14.17.0 16.3.0
```

### バイナリのミラーを使用する

デフォルトのNodeソースからダウンロードできない場合、ミラーを指定できます：

```bash
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
nvm install node
```

### カスタムカラーの設定

バージョン情報の表示に使用される色をカスタマイズできます

```bash
nvm set-colors rgBcm
```

## nvmのメリット

1. **圧倒的な人気と安定性**：長年の開発により非常に安定しており、多くの問題が修正されています。

2. **シンプルな使用法**：直感的なコマンドで簡単に使用できます。

3. **強力なバージョン管理**：.nvmrcファイルによるプロジェクト固有の設定が可能です。

4. **LTSサポート**：LTSバージョンを簡単にインストールできます。

5. **コミュニティサポート**：大規模なユーザーベースによる豊富な情報と問題解決のリソースがあります。

## 注意点

1. **Windowsサポート**：Windows WSLでは動作しますが、ネイティブWindowsシェルはサポートしていません（代わりにnvm-windowsを使用）。

2. **Fishシェル**：Fishシェルには直接対応していません（代替ソリューションあり）。

3. **メモリ使用量**：複数のNode.jsバージョンをインストールすると、ディスク容量を消費します。

## まとめ

nvmは、Node.js開発者にとって必須のツールと言えるでしょう。複数のプロジェクトで異なるNode.jsバージョンを使用する必要がある場合、nvmを使えば簡単に切り替えることができます。GitHubで84.3k以上のスターを獲得している人気の理由がよくわかります。

また、プロジェクトレベルで`.nvmrc`ファイルを使用することで、チームメンバー全員が同じNode.jsバージョンを使用することが保証され、「動作しない」という問題を未然に防ぐことができます。

# 関連資料
- [nvm - GitHub](https://github.com/nvm-sh/nvm)
- [nvm-windows - GitHub](https://github.com/coreybutler/nvm-windows)
- [nvm — Homebrew Formulae](https://formulae.brew.sh/formula/nvm)
- [nodenv - GitHub](https://github.com/nodenv/nodenv)
- [nvm(Node Version Manager)を使ってNode.jsをインストールする手順](https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a)
- [nvmのインストール方法【Node Version Manager】](https://qiita.com/ryome/items/f2a0bc2de007da30bbfd)