Node.jsのバージョンを自動で切り替えられるnodenvが超便利

サーバーサイドで動作するJavaScript[Node.js](https://nodejs.org/en/)はSassのコンパイル、webpackの使用等、今やフロントエンド開発に欠かせないものです。**Node.jsを使う場合、バージョンを自動で切り替えられる [nodenv](https://github.com/nodenv/nodenv)というツールがお薦めです。**本エントリーではnodenvのメリットと、基本的な使い方について解説します。

# Node.jsのバージョン管理
プロジェクトによっては古いNode.jsのバージョンで動作が安定し、違うNode.jsにしてしまうと動作しなくなる、といったケースは現場でよくあります。しかし、プロジェクトを切り替える度、**現在のNode.jsをアンイストールして目的のバージョンのNode.jsをインストールする、というのは時間がかかります**。

このようなNode.jsのバージョン問題を解決するため、Node.jsのバージョン管理をするツールとしてmacOSの「[Nodebrew](https://github.com/hokaccha/nodebrew)」があります。

Nodebrewを用いると、下記のようにプロジェクト毎にバージョンを切り替えることができます。

```bash:コマンドライン
nodebrew use v0.10.12
```

▲ Node.jsのv0.10.12を使う

```bash:コマンドライン
nodebrew use v7.9.0
```

▲ Node.jsのv7.9.0を使う

これで充分便利なのですが、**Node.jsのバージョン切り替えコマンドを実行するというのが手間です**。

この手間を省くのが、nodenvです。

# 自動でNode.jsのバージョンを切り替えるnodenv
**nodenvを用いると、プロジェクトに移動するだけでNode.jsのバージョンが自動で切り替わります**。手動でNode.jsのバージョンを切り替える必要が無いため、開発者はNode.jsのバージョン問題に時間を取られることなく、作業を進められます。

## インストール方法
nodenvのインストールには、「[anyenv](https://github.com/riywo/anyenv)」というツールを用いるのが便利です。nodenvの他にもPHPのバージョン管理をする[phpenv](https://github.com/phpenv/phpenv)、Swiftのバージョン管理をする[swiftenv](https://github.com/kylef/swiftenv)といったバージョン管理ツールが存在するのですすが、anyenvとは「〜env」と名前のついた各バージョン管理ツールをまとめて扱うものです。

インストールはコマンドラインを使いますが、コピペだけでできるので手軽です。以下のコマンドを一行ずつ実行してください。

```bash
git clone https://github.com/riywo/anyenv ~/.anyenv
```

```bash
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
```

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

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

なお、[公式リポジトリ](https://github.com/riywo/anyenv)においては、上記コマンドの`bash_profile`部分が`your_profile`となっていますが、`bash_profile`に環境変数を記載して問題ありません。`bash_profile `については記事「[.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの？ - Qiita](http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)」が参考になります。

anyenvのインストールが完了したら、次のコマンドでnodenvをインストールします。

```bash:コマンド
anyenv install nodenv
```

```bash:コマンド
exec $SHELL -l
```

下記のコマンドを実行し、バージョン番号等が表示されれば成功です。

```bash:コマンド
nodenv
```

![image](https://qiita-image-store.s3.amazonaws.com/0/67884/666f90ef-4cf0-c3c7-fd45-767bd34a184b.png)

以上でnodenvの環境が準備できました。

# プロジェクト毎のNode.jsバージョン切り替え例
では、nodenvを使って下記のようにプロジェクトごとにNode.jsのバージョン切り替えを行ってみます。

- プロジェクトAではNode.js v7.9.0を使う
- プロジェクトBではNode.js v0.12.18を使う

## Node.jsのインストール
Node.jsのインストールには、次のコマンドを用います。

```bash:コマンド
nodenv install (バージョン)
```

今回の例では、v7.9.0と v0.12.18が必要なので、次のようにインストールします。

```bash:v7.9.0のインストールコマンド
nodenv install 7.9.0
```

```bash:v0.12.18のインストールコマンド
nodenv install 0.12.18
```

## プロジェクトAで使用するNode.jsのバージョン設定
プロジェクトで使用するNode.jsのバージョンを設定するには、次のコマンドを用います。

```bash:コマンド
nodenv local (バージョン)
```

プロジェクトA用のフォルダにて、v7.9.0を使う設定をします。

```bash:プロジェクトAフォルダに移動コマンド
cd (プロジェクトAフォルダへのパス)
```

```bash:v7.9.0の使用コマンド
nodenv local 7.9.0
```

Node.js v7.9.0が使えるかどうかをチェックしてみましょう。次のコマンドでNode.jsのバージョンを確認します。

```bash:Node.jsのバージョン確認コマンド
node -v
```

v7.9.0のバージョン番号が出力されていれば成功です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/eaa13b83-ce13-21e9-13be-5c55daeee8af.png)

これまでNode.jsを使用してきていたのと同じく、`npm`コマンドも使用できます。

ところで、`local`コマンドを実行すると、プロジェクトフォルダ内に`.node-version`という設定ファイルができます。**`.node-version`にはこのプロジェクトで使用するNode.jsのバージョンが記述されているため、このフォルダに移動した時に、自動的にバージョンが切り替わる仕組みになっているのです**。

![image](https://qiita-image-store.s3.amazonaws.com/0/67884/a340fbbf-df01-dc60-a3ab-c217845b7544.png)

▲ `.node-version`ファイルの中身

## プロジェクトBでの設定
プロジェクトBではv0.12.18を使う設定をします。

```bash:プロジェクトBフォルダに移動コマンド
cd (プロジェクトBフォルダへのパス)
```

```bash:v.0.12.18の使用コマンド
nodenv local 0.12.18
```

Node.js　v0.12.18に切り替わっているか確認してみましょう。

```bash:Node.jsのバージョン確認コマンド
node -v
```

v0.12.18が表示されていれば成功です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/69cc6a5c-3733-bb77-4291-ab8ef5428896.png)

## フォルダを移動してバージョンが自動で切り替わるかを確認する
Node.jsのバージョンが自動で切り替わるか確認をしてみましょう。

```bash:プロジェクトAフォルダに移動コマンド
cd (プロジェクトAフォルダへのパス)
```

```bash:Node.jsのバージョン確認
node -v
```

プロジェクトAで使用するNode.js v7.9.0に切り替わります。
![](https://qiita-image-store.s3.amazonaws.com/0/67884/36b38749-f0f6-ac22-7389-7f9ba4201ce6.png)


```bash:プロジェクトBフォルダに移動コマンド
cd (プロジェクトAフォルダへのパス)
```

```bash:Node.jsのバージョン確認
node -v
```

プロジェクトBで使用するNode.js v0.12.18に切り替わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/67884/cdab82cc-c624-981f-a87a-5c62335e7e19.png)

# デフォルトで使用するNode.jsのバージョンも指定しておく
バージョンを固定したプロジェクトフォルダ以外では、特にバージョン指定せずにNode.jsを使いたい場合もあるでしょう。その場合は、デフォルトで使用するNode.jsのバージョンを指定しておくと便利です。

```bash:コマンド
nodenv global (デフォルトで使用したいバージョン)
```

たとえば、7.9.0をデフォルトバージョンにするには、次のようにします。

```bash:コマンド
nodenv global 7.9.0
```

# Windowsではnodistで自動バージョン切り替え
nodenvはmacOS用ですが、[nodist](https://github.com/marcelklehr/nodist)を使うとWindowsでも`.node-version`によるNode.jsの自動バージョン切り替えが可能です。Windows、macOS問わず、Node.jsのバージョン自動切り替えができるのは嬉しいですね。

※ 本エントリーのコメント欄にて、 @Jaman1993 さんより教えていただきました。

# nodenvは便利
複数のプロジェクトを開発するにあたって、Node.jsのバージョン管理ツールは必須。筆者は主に[Nodebrew](https://github.com/hokaccha/nodebrew)を使っていましたが、**プロジェクトごとにバージョンを自動で切り替えたいと思い、nodenvを使うようになりました**。おかげでプロジェクト毎にNode.jsのバージョンを意識する必要がなくなり、時間短縮に繋がりました。お勧めです。