nvm(Node Version Manager)を使ってNode.jsをインストールする手順

## 概要

- Node.jsは現代のWeb開発において必須のJavaScriptランタイム環境ですが、プロジェクトごとに異なるバージョンが必要になることがよくあります
- そのため、Node.jsの開発環境を構築するにあたって、`nodebrew`、`nvm`のようなバージョン管理ツールを使うことが重要です
- この記事では、`nvm` を使ったNode.jsのインストール、検証、バージョン管理、アップデート手順について詳しく紹介します

## 記事の前提

- この記事は **macOS** を前提としています
- Windowsの場合は、以下のような別の記事を参考にしてください
    - [nvm-windows の導入と簡単な操作をやってみた](https://qiita.com/akipon0821/items/eaeffe79221cfcd4d258)

## 用語整理

まずは、基本的な用語を整理します。

| 用語 | 説明 |
|------|------|
| **Node.js** | サーバーサイドでJavaScriptを実行する環境（ランタイム）のこと |
| **nvm(Node Version Manager)** | 複数のNode.jsバージョンを簡単にインストール、切り替え、管理できるコマンドラインツールのこと。複数バージョンのNode.jsをプロジェクトごとに切り替えられる﻿ |
| **npm (Node Package Manager)** | Node.jsのパッケージ管理ツールのこと。ライブラリやフレームワークのインストールに使用 |
| **LTS (Long Term Support)** | 長期サポート版という意味。安定性を重視する実運用環境に推奨 |
| **Stable** | 安定版という意味。最新の機能と一定の安定性を兼ね備えたバージョン |

## インストール

以下のコマンドを使用して`nvm`をインストールします

```bash:curlでのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
```

- 注1: 上記のバージョン番号（v0.40.3）は記事執筆時点のものです
    - 最新バージョンは[nvmの公式リポジトリ](https://github.com/nvm-sh/nvm)で確認してください
- 注2: Homebrewでのインストール方法を掲載しているブログもありますが、現在、`Homebrewでのインストールは公式でサポートしていない`のでHomebrewでインストールはしない方が良いです
    - 以下、https://github.com/nvm-sh/nvm より引用
        ```
        Homebrew installation is not supported. 
        If you have issues with homebrew-installed nvm, 
        please brew uninstall it, and install it using the instructions below, 
        before filing an issue.
        ```

### nvmのインストール検証

次に正常にインストールされているか検証します。

```bash:検証コマンド
command -v nvm
```

- `nvm`と表示されたらインストールは成功です
- もしここで、`nvm: command not found`と表示されたら、シェルの設定ファイルを再読み込みする必要があります
- これは、インストールスクリプトがシェル設定ファイルに環境変数を追加したためです
- 以下のコマンドを実行してから、もう一度 `command -v nvm` を実行してください

##### bashの場合

```bash
source ~/.bash_profile
```

##### zshの場合

```zsh
source ~/.zshrc
```

- **注:** `source`コマンドはシェル設定ファイルを現在のシェルセッションに再読み込みするためのコマンドです

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

nvmを使ってNode.jsをインストールする方法は以下、2つの選択肢があります
1. stable（安定版）
2. LTS（長期サポート版）

### stableバージョンを使う場合

最新の安定版を使いたい場合は以下のコマンドを実行します。

```bash:stableバージョン
nvm install stable --latest-npm
nvm alias default stable
```

* `stable`は、Node.jsの安定したバージョンをインストールするオプションです
* `--latest-npm`は、最新版のnpmもインストールするオプションです
* `nvm alias default stable`は、安定したバージョンをデフォルトとして設定します
    * これにより、新しいターミナルを開いた時に自動的にこのバージョンが使用されます

### LTS(Long Term Support)バージョンを使う場合

- LTSとは長期間に渡って、安全なメンテナンスリリースが実施されるバージョンです
- 最新機能よりも安定性を重視する場合は、LTSバージョンを使用することをお勧めします

LTSのリリースは以下、6つの修正に限定されています。

1. バグ修正
2. セキュリティアップデート
3. semverのメジャーバージョンに影響しないnpmアップデート
4. 関連するドキュメントの更新
5. 既存アプリケーションを破壊するリスクが最小限である特定のパフォーマンス改善
6. 既存アプリケーションを破壊するリスクが低く、コードの変更量が多い変更（将来の変更を容易にバックポートできるようにするため）

LTSバージョンをインストールするには以下のコマンドを実行します

```bash:LTSバージョン
nvm install --lts --latest-npm
nvm alias default 'lts/*'
```

- `--lts` は、LTSバージョンの最新をインストールするオプションです
    - LTSなどのリリース計画について詳しく知りたい方は[こちらを参考](https://github.com/nodejs/Release#release-plan)にしてください
    - リリーススケジュールを知りたい方は[こちらを参考](https://github.com/nodejs/Release#release-schedule)にしてください
- `nvm alias default 'lts/*'`
    - 最新のLTSバージョンをデフォルトとして設定します
   

## Node.jsのサンプルコード

インストールが正常に完了していることを検証するために、簡単なWebサーバーを作成してみましょう。以下の内容で`web_example.js`というファイルを作成します。

```javascript:web_example.js
const http = require("http");
  
http.createServer((request, response) => {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);
```

このコードは、Node.jsの標準モジュール`http`を使用して、シンプルなWebサーバーを作成しています。8888ポートでリクエストを待ち受け、アクセスがあると「Hello World」というテキストを返します。

ファイルを保存したら、以下のコマンドで実行します

```bash
$ node web_example.js
```

ブラウザで以下のURLにアクセスしてみてください
http://localhost:8888/

`Hello World`と表示されたらNode.jsが正常にインストールできています。

## Node.jsのバージョンアップ手順

Node.jsのバージョンをアップデートするには、インストール手順と同様のコマンドを使用します。

```bash:Node.jsのバージョンアップ
nvm install --lts
nvm alias default 'lts/*'
```

npm自体のバージョンアップも実施します。

```bash
nvm install-latest-npm
```

- **注:** 上記コマンドで、現在使用中のNode.jsのバージョンに対応した最新のnpmがインストールされます

### 一時的に異なるバージョンを使用する場合

動作検証などで一時的に異なるバージョンを使う場合は、`use` コマンドを使います。

```bash
nvm install stable --latest-npm  # まだインストールしていなければインストール
nvm use stable                  # 一時的にstableバージョンを使用
```

- **注:** `use`コマンドは現在のターミナルセッションのみに適用されます
    - 新規にターミナルを開くと、デフォルトのバージョンに戻ります

### 特定のバージョンをインストールする場合

特定のバージョンにしたい場合は、`nvm ls-remote`で利用可能なバージョンを確認してから、そのバージョンをインストールします。

```bash:利用可能なバージョンの確認
nvm ls-remote
...
    v22.13.1   (LTS: Jod)
->  v22.14.0   (Latest LTS: Jod)
    v23.0.0
    v23.1.0
    v23.2.0
```

```bash:例：v23.2.0に変更する場合
nvm install v23.2.0
nvm alias default v23.2.0
```

## プロジェクトごとにNode.jsのバージョンを固定する場合

- チームで開発を行う場合など、プロジェクトでNode.jsのバージョンを固定したい場合があります
- そのような場合、`.nvmrc` ファイルを作成してソース管理することで、プロジェクトメンバー全員が同じバージョンを使用できるようになります

以下は、最新のLTSバージョンで固定する例です

```bash:最新のltsで固定する場合
echo "lts/*" > .nvmrc
nvm install # 初回のみ実行する（.nvmrcファイルの内容に基づいてインストール）
nvm use     # .nvmrcファイルの内容に基づいてバージョンを切り替え
```

**注:** プロジェクトディレクトリに`.nvmrc`ファイルを配置することで、そのディレクトリで`nvm use`コマンドを実行すると、指定したバージョンが自動的に使用されます。

## nvm本体のバージョンアップ方法

nvmツール自体をアップデートするには、以下のコマンドを実行します。

```bash:コマンド
(
  cd "$NVM_DIR"
  git fetch --tags origin
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"
```

**実行結果の例**

```bash:実行結果
remote: Enumerating objects: 221, done.
remote: Counting objects: 100% (186/186), done.
remote: Compressing objects: 100% (41/41), done.
Unpacking objects: 100% (77/77), 21.88 KiB | 393.00 KiB/s, done.
remote: Total 77 (delta 57), reused 55 (delta 36), pack-reused 0 (from 0)
From https://github.com/nvm-sh/nvm
   0641363..759f70f  master     -> origin/master
HEAD is now at 179d450 v0.40.1
```

## nvmのアンインストール方法

nvmを削除したい場合は、以下の手順を実行してください

1. nvmディレクトリを削除します
    ```bash
    nvm_dir="${NVM_DIR:-~/.nvm}"
    nvm unload
    rm -rf "$nvm_dir"
    ```
2. シェル設定ファイルからnvm関連の設定を削除します。`.bash_profile`、`.zshrc`、`.profile`、または`.bashrc`を開き、以下のような行を削除します
    ```
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    ```
3. シェル設定を再読み込みします
    ```bash
    source ~/.zshrc  # または使用しているシェルの設定ファイル
    ```

## トラブルシューティング

nvmやNode.jsの使用中に発生する可能性のある一般的な問題と解決策を紹介します

### 1. `nvm: command not found`エラー

**解決策**
- シェル設定ファイル（`.zshrc`や`.bash_profile`など）に正しくnvmの設定が追加されているか確認
- `source ~/.zshrc`（または該当するシェル設定ファイル）を実行して設定を再読み込み

### 2. パーミッションエラー

**解決策**
- `sudo`を使わずにnvmをインストールしてください
    - nvmは、一般ユーザーの権限で実行するように設計されています
- `.nvm`の権限を確認
    - `ls -la ~/.nvm`

### 3. 特定のバージョンのインストールに失敗する

**解決策**
- インターネット接続を確認
- `nvm ls-remote`で利用可能なバージョンを確認
    - 正確なバージョン番号を使用しているか確認（例：`v18.9.1`）

## その他参考となる記事

- [Installing Node.js with NVM](https://medium.com/@Joachim8675309/installing-node-js-with-nvm-4dc469c977d9)
    - こちらの記事には、Windowsでのインストール方法も掲載されています
    - Expressのサンプルコードも一緒に掲載されているので良い感じです
- [Installing a custom version of NVM and Node.js](https://help.dreamhost.com/hc/en-us/articles/360029083351-Installing-a-custom-version-of-NVM-and-Node-js)
    - `web_examle.js`はこちらの記事を参考にいたしました

## チェックリスト

以下のチェックリストを使用して、Node.js環境のセットアップが完了したことを確認してください

- [ ] nvmが正常にインストールされている
    - `command -v nvm` で確認
- [ ] Node.jsがインストールされている
    - `node -v` で確認
- [ ] npmが正常に機能している
    - `npm -v` で確認
- [ ] サンプルコード
    - `web_example.js` が正常に動作する
- [ ] デフォルトのNode.jsバージョンが設定されている
    - `nvm current` で確認
- [ ] (任意) プロジェクト用の`.nvmrc`ファイルが作成されている

## [宣伝] GAS入門の教材 - Udemy

- 2023年11月時点で、約3,000人の受講生を獲得し、UdemyBusinessにも選定されてます
- もしGASに興味があれば、以下のバナーからUdemyにて購入ご検討ください

https://www.udemy.com/course/wywy-google-apps-script-forty-skills/?referralCode=7F71969F9DD9849220B4