Homebrew + anyenv + nodenv でNode.jsをインストール

転職とともにアウトプットする機会がガクンと減ってしまい、このままじゃまずいぞということで自分用に少しずつ記事を投稿していくことにしました。
今回はNode.jsのバージョン管理をnodenvで、nodenvの管理をanyenvでする方法をメモしていきたいと思います。


## 環境
macOS Big Sur 11.3.1


## 手順
1. Homebrewのインストール
2. anyenvのインストール
3. nodenvのインストール
4. Node.jsのインストール


## Homebrewのインストール
https://brew.sh/index_ja

まずはHomebrewをインストールしてきます。
HomebrewとはmacOS上で動作するパッケージ管理システムです。（windowsでは動作しません）
パッケージ管理システムとは、各種ソフトウェアのインストールやアンインストール、また、ソフトウェア同士やライブラリとの依存関係を管理してくれるシステムのことです。
どこが便利なのかというと、ブラウザなどから直接ダウンロード → インストールをしてくると、最新バージョンがリリースされた際に再度ダウンロード → インストールをしなければなりません。
その際に、前のバージョンの関連ファイルを削除する必要があったり、削除するにもどれが関連ファイルなのかを見分ける必要があります。
そんな手間をコマンドひとつで自動でしてくれるのが、パッケージ管理システムです。

まずはインストールされているか確認します。

```bash
brew -v
```

入っていなければインストールします。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

無事に入ったか再度確認します。

```bash
brew -v
```

バージョンが表示されたらインストール完了です。

```bash
Homebrew 3.2.16
Homebrew/homebrew-core (git revision f32b02f82ba; last commit 2021-10-13)
Homebrew/homebrew-cask (git revision 5b3abdb847; last commit 2021-10-13)
```


## anyenvのインストール
https://github.com/anyenv/anyenv

次にanyanvをインストールします。
anyanvとはNode.jsでnodenvを、Rubyならrbenvを、といったように、言語のバージョンを管理してくれる **env たちを管理するものです。
なぜ言語のバージョンを管理する必要があるのかというと、例えば、プロジェクトAで使用するNode.jsのバージョンがv13系で、プロジェクトBのNode.jsのバージョンがv14系だった場合、プロジェクトAからBへ作業を切り替える際にv14系へアップデートをする必要があります。
また逆に、プロジェクトAの作業に戻る際はv13系に戻さなくてはなりません。
このような面倒な作業をコマンド一つでやってくれるのがnodenvで、そのnodenvを管理してくれるのがanyanvなのです。複雑・・・！

Homebrewを使ってインストールしてみましょう。
（GitHubからダウンロードしてインストールすることも可能です。）

```bash
brew install anyenv
```

anyenvを初期化します。

```bash
anyenv install --init
```

パスの設定をします。（zshの場合）

```bash
echo 'eval "$(anyenv init -)"' >> ~/.zshrc
```

シェルを再起動します。

```bash
exec $SHELL -l
```

以上でインストール完了です。


## nodenvのインストール
https://github.com/nodenv/nodenv

次にnodenvをインストールします。
nodenvとはNode.jsのバージョン管理ツールです。プロジェクトを移動するだけでNode.jsのバージョンを自動で切り替えることができます。

anyenvからインストールをします。

```bash
anyenv install nodenv
```

シェルを再起動します。

```bash
exec $SHELL -l
```

確認してみます。

```bash
nodenv
```

下記のようにバージョン番号等が表示されれば成功です。

```bash
nodenv 1.4.0+3.631d0b6
Usage: nodenv <command> [<args>]

Some useful nodenv commands are:
   commands    List all available nodenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
（省略）
```


## Node.jsのインストール
最後にNode.jsをインストールして、バージョンを切り替えてみます。
Node.jsとは、もともとブラウザ上で動くJavaScriptをパソコン（OS）上でも動かせるようにする技術です。
BabelでJavaScriptをES5に変換したり、SassをCSSにコンパイルしたり、webpackでバンドルしたりなど、フロントエンド開発には欠かせないものとなっています。

まずはインストール可能なバージョンのリストを確認します。

```bash
nodenv install -l
```

インストールしたいバージョンを記述してインストールします。

```bash
nodenv install (インストールしたいバージョン)
# nodenv install 14.17.5
```

インストールが完了したらバージョンを確認してみましょう。

```bash
node -v
```

指定したバージョンが表示されれば完了です。

```bash
v14.17.5
```


## Node.jsのバージョン切り替え方法
まずは指定したいプロジェクトへ移動します。

```bash
cd (プロジェクトへのパス)
```

ローカル指定でバージョンを設定します。

```bash
nodenv local 14.17.5
```

上記のlocalコマンドを実行すると、`.node-version` ファイルが作成されます。
`.node-version` を開いてみると、プロジェクトで使用するNode.jsのバージョンが記述されているかと思います。
nodenvは `.node-version` がある場合、そのバージョンのNode.jsを使用するよう自動で切り替てくれます。


## 最後に
今までは先輩に教わってなんとなくでやっていたNode.jsのバージョン管理でしたが、文章にまとめてみることで理解度が増した気がします。
また、この記事を作成している途中で [Volta](https://volta.sh/) というものがリリースされていることを知りました。Volta はなんと Windows・Mac・Linux と、どのOSでも作動するみたいです。今まではMacユーザーしかいない環境だったのですが、Windows多数の環境に変わったので便利そうだなーと思いました。
もう少し情報収集をしてみて、良さそうだったら試してみようかと思います^^
それではまた！

- [Node.jsのバージョン管理にVoltaを推したい](https://zenn.dev/taichifukumoto/articles/how-to-use-volta)
- [Node.js のバージョン管理ツール Volta を使ってみる](https://dev.classmethod.jp/articles/node-version-volta/)
- [【JS】Node.jsのバージョン管理をnodenvからvoltaに変更した理由と感想](https://jsnotice.com/posts/2021-05-07/)


## 参考記事
- [JavaScriptをサーバサイドで動かせる！Node.jsの魅力とは？](https://digitalidentity.co.jp/blog/creative/javascript-nodejs.html)
- [homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
- [【完全版】Homebrewとはなんぞや](https://zenn.dev/sawao/articles/e7e90d43f2c7f9)
- [Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)
- [Node.jsのバージョンを自動で切り替えられるnodenvが超便利](https://qiita.com/tonkotsuboy_com/items/5322d226b6783d25b5df)
- [MacにNode.jsをインストール（anyenv + nodenv編）](https://qiita.com/kyosuke5_20/items/eece817eb283fc9d214f)
- [anyenvとnodenvでNode.jsのバージョン管理をしよう！](https://www.to-r.net/media/anyenv/)
- [Homebrew 経由の anyenv 経由の nodenv 経由で Node.js をインストールする](https://qiita.com/ucan-lab/items/ce35bcaf2562054917a8)
- [anyenv + macOS環境構築](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)
- [.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの？](https://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)