🌲nodenv：Node.jsのバージョン管理をスマートに行う

## はじめに

Node.jsのバージョン管理ツールである`nodenv`について、整理も兼ねて実務で使う基本コマンドをまとめました。

## 目次

1. [nodenvとは？](#-nodenvとは)
2. [nodenvと他のツールの違い](#-nodenvと他のツールの違い)
3. [nodenvの仕組み](#-nodenvの仕組み)
4. [nodenvの導入手順](#-nodenvの導入手順)
5. [nodenvの基本コマンドまとめ](#-nodenvの基本コマンドまとめ)
6. [nodenvの活用例](#-nodenvの活用例)
7. [トラブルシューティング](#-トラブルシューティング)
7. [まとめ](#-まとめ)
8. [参考文献](#-参考文献)

## 🧷 nodenvとは？
`nodenv`は、Node.jsのバージョン管理ツールです。
複数のNode.jsバージョンを簡単に切り替えたり、プロジェクトごとに異なるバージョンを使い分けたりできます。

### ✅ nodenvを使うメリット
* プロジェクトごとに異なるNode.jsバージョンを指定できる
* 最新のNode.jsバージョンへ素早くアップデート可能
* システムのデフォルトバージョンを変更せずに切り替えられる
* npmと組み合わせて、環境構築がスムーズ

## 🧷 nodenvと他のツールの違い
### ✅ nodenvの特徴
* プロジェクトごとのバージョン固定が簡単
  * `nodenv local`でプロジェクトごとにバージョンを指定できる
* 高速で軽量
  * 必要な時にバージョンを切り替える仕組みで、無駄なメモリ消費が少ない
* npmのバージョン管理もシンプル
  * Node.jsのバージョンに応じたnpmが自動的に切り替わる

### 🚫 nvmとの違い
* `nvm`はシェルごとにバージョンが反映されるのに対し、`nodenv`はディレクトリ単位で自動的にバージョンが反映されるため使い勝手が良い。

## 🧷 nodenvの仕組み
nodenvは、Node.jsのバージョン切り替えを **シムリンク（仮想的な参照リンク）** で実現しています。

### ✅ バージョン選択の優先順位
`nodenv`は以下の順でバージョンを読み取ります。

#### 1. ローカル設定 (`nodenv local`)
* 現在のプロジェクトディレクトリ内で指定したバージョン
#### 2. 環境変数 (`NODE_VERSION`)
* 環境変数で一時的にバージョンを指定する場合
#### 3. グローバル設定 (`nodenv global`)
* システム全体のデフォルトバージョン
#### 4. デフォルトのNode.js
* `nodenv`が管理していない場合は、OSにインストールされているデフォルトのNode.js

## 🧷 nodenvの導入手順
### ✅ ① インストール
#### macOSの場合（Homebrew使用）
```bash
brew install nodenv
```

#### Linuxの場合（Ubuntu例）
```bash
git clone https://github.com/nodenv/nodenv.git ~/.nodenv
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(nodenv init -)"' >> ~/.bashrc
exec $SHELL
```
* `nodenv`をPATHに追加し、起動時に反映するように設定します。

### ✅ ② node-buildプラグインをインストール
`node-build`はnodenvでNode.jsをインストールするために必要なプラグインです。
```bash
brew install node-build
```
これで`nodenv install`コマンドでNode.jsがインストールできるようになります。

### ✅ ③ 動作確認
```
nodenv -v
```
`nodenv`のバージョンが表示されればインストール成功！

## 🧷 nodenvの基本コマンドまとめ
### 🌤️ Node.jsバージョンの確認
#### 🌿 現在のNode.jsバージョンを確認
```bash
nodenv version
```
```bash
20.10.0 (set by /path/to/.node-version)
```
* 現在有効になっているNode.jsのバージョンを表示します。
* バージョンが `.node-version` ファイルで指定されている場合は、そのパスも表示されます。

#### 🌿 インストール可能なバージョン一覧を表示
```bash
nodenv install -l
　または
nodenv install --list-all
```
* インストール可能なNode.jsのバージョン一覧を表示します。
* `-l` と `--list-all` は同じ意味で、どちらでも利用できます。

#### 🌿 特定のバージョンのみ絞り込んで表示
```bash
nodenv install --list | grep -e "^20"
```
* 上記だと`grep` コマンドで20系のバージョンのみ絞り込み表示します。
* 最新のLTSや特定系統のみインストールしたい場合に便利です。

### 🌤️ Node.jsバージョンのインストールと管理
#### 🌿 nodenvとnode-buildを最新化
```bash
brew upgrade nodenv node-build
```
* `brew`でnodenvとnode-buildを最新バージョンにアップグレードします。
* インストール可能なNode.jsバージョンが古い場合に最新版を取得するために実行します。

#### 🌿 インストール済みのNode.jsバージョン一覧を表示
```bash
nodenv versions
```
```bash
  18.17.1  
* 20.10.0 (set by /usr/local/nodenv/version)  
  21.2.0
```
* すでにインストール済みのNode.jsバージョンを確認できます。
* `*` がついているバージョンが現在有効になっているものです。

#### 🌿 新しいNode.jsバージョンをインストール
```bash
nodenv install <バージョン番号>
```
```bash
nodenv install 20.10.0
```
* インストール後は`nodenv versions`でインストール済みかどうか確認しよう！

### 🌤️ 使用バージョンの設定
#### 🌿 ローカル環境でプロジェクトごとに使用バージョンを指定
カレントディレクトリ以下で特定バージョンを使用
```bash
nodenv local <バージョン番号>
```
* 現在のディレクトリで特定のNode.jsバージョンを使用するように設定します。
* `.node-version`ファイルが作成され、プロジェクトごとにバージョンを固定できます。

#### 🌿 グローバル（システム全体）で使用バージョンを指定
```bash
nodenv global <バージョン番号>
```
* システム全体でのデフォルトNode.jsバージョンを指定します。
* グローバル設定は他のプロジェクトでも適用されます。

#### 🌿 再認識（rehash）
```bash
nodenv rehash
```
* 新しいバージョンをインストールしたり変更した後に、nodenvに変更を認識させます。
* これを実行しないと、インストール済みのNode.jsが**反映されない場合**があります。
* 基本的にrehashが必要なタイミングは以下
    * `npm install -g` で新しい CLI コマンドを入れたとき
    * `npm uninstall -g` でグローバルツールを消したとき

### 🌤️ npmのバージョン確認
```bash
npm -v
```
* 現在使用中のnpmのバージョンを確認します。

## 🧷 nodenvの活用例
### 🚀 プロジェクトごとに異なるNode.jsバージョンを使う
プロジェクトAとBで異なるNode.jsバージョンを使いたい場合
```bash
# プロジェクトA
cd ~/project-a
nodenv local 18.17.1

# プロジェクトB
cd ~/project-b
nodenv local 20.10.0
```
* project-aでは18系、project-bでは20系が使用されます。

## 🧷 トラブルシューティング
### ⚠️ インストールしたバージョンが反映されない場合
`nodenv rehash`を実行
```bash
nodenv rehash
```

### ⚠️ 最新のNode.jsバージョンが表示されない場合
`brew upgrade`でnodenvとnode-buildを最新化
```bash
brew upgrade nodenv node-build
```

## 🎉 まとめ
* 新しいNode.jsバージョンがリリースされた場合は、`brew upgrade nodenv node-build`で最新化しましょう。
* プロジェクトごとに異なるバージョンを使う場合は、`nodenv local`を活用。
* 不具合時は`nodenv rehash`で再認識を促しましょう。


✅ nodenvを導入することで、プロジェクトごとに柔軟なNode.jsのバージョン管理が可能になり、開発環境の構築が効率的になります！

## 💫 参考文献
* [nodenvを導入してNode.jsのバージョンを管理する](https://engineer-blog.ajike.co.jp/nodenv/)
* [nodenvでNode.jsをバージョン管理する](https://qiita.com/kaburankattara/items/3ce735e51ba6226cc34a)