node.js のインストール・アップデート・バージョン切替えの手順（nodebrew、Mac）

ホームディレクトリにインストールするための手順。
環境は Mac OSX 10.15.7 Catalina。以下、ターミナルでの操作。


## すでにインストーラーで入れた node.js と npm が入っている場合、一旦アンインストールする

トラブルやゴミファイルの残存を防ぐため、まっさらにしておく。
インストーラーでインストールした node.js のアンインストール

```
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

npm（ホームディレクトリにある）のアンインストール
`sudo rm -rf ~/.npm`


## nodebrew のインストールと設定

インストール。ホームディレクトリで以下コマンド
`curl -L git.io/nodebrew | perl - setup`
ホームディレクトリにインストールされる（.nodebrewディレクトリ）

インストールできたか確認（※helpにハイフン不要）
`nodebrew help`

ヘルプが表示されない場合はPATHを確認
`echo $PATH`

"ホームディレクトリ/.nodebrew/current/bin" へのPATHが通っていなければ PATH を通す。vi 等でホームディレクトリの .zshrc (無ければ作成。bash なら .bash_profile) に `export PATH=$HOME/.nodebrew/current/bin:$PATH` を追記。

vi操作：iで編集モード、escキーで戻り、:wqで上書き保存
`export PATH=$HOME/.nodebrew/current/bin:$PATH`
ターミナル再起動する（or `source ~/.zshrc`）

今一度 PATH を確認。
`echo $PATH`
/Users/taku_n/.nodebrew/current/bin が追加されていればO.K.

特定バージョンを使いたいなら.zshrc に以下を追記
`nodebrew use v14.17.6`

nodebrew自身を最新版にアップデート
`nodebrew selfupdate`


## node.js, npm のインストール/アップデートとバージョンの切替え

nodebrew でインストール済みの node.js のバージョンのリストを確認
`nodebrew ls`

メモ：`Use of uninitialized value $a1 in numeric comparison (<=>) at /Users/(ユーザ)/.nodebrew/current/bin/nodebrew line 675.` とメッセージが出る場合は、`rm /Users/(ユーザー)/.nodebrew/node/.DS_Store` で解消

現在使用中のバージョン(current:vX.X.X)と、最新の node.js の[バージョン(安定版、最新版)](https://nodejs.org/ja/)を比較。

現在インストールしているパッケージのリストをエディタにコピペしておく(A)
`npm list --depth=0 -g`
 
一応 nodebrew 自身を最新版にアップデート
`nodebrew selfupdate`

node.js のインストール ※600MB以上あり結構時間かかるので注意
`nodebrew install v16.8.0`
(要バージョン指定。昔できた `nodebrew install latest/stable` はエラーとなる)

バージョンの切替え（= ~/.nodebrew/current のシンボリックリンクの切替え）
* `nodebrew use v16.8.0` バージョンを指定
  (`nodebrew use latest/stable` で最新版/安定版に切り替えることはできなくなった)

バージョンが無事切り替わっているか確認
`node -v` → v16.8.0

### npm のアップデート(必要なら)

npm も同時にインストールされるが、最新版になっていないこともある。
最新バージョンを[チェック](https://github.com/npm/cli)し、現在のバージョンを確認。
`npm -v` → 7.21.0

新しいバージョンが出ているならアップデート
`npm update -g npm`

バージョンを再度確認
`npm -v` → 7.21.1

#### node.js のバージョン切替えをした場合のパッケージの移行

バージョンごとに切り分けての管理となるので、上記の `nodebrew use` でnode.jsのバージョンを切り替えると、切替え前にnpmでインストールしたパッケージモジュール群が使えなくなる。

~/.nodebrew/node/vx.x.x[切り替え前のバージョン]/lib/node_modules を
~/.nodebrew/node/vx.x.x[切り替え後のバージョン]/lib/node_modules に以降しても良いが、今回は移行後のバージョンに切り替えている状態で、移行前のバージョンで入れていたパッケージを新たにインストールする。

元バージョンでインストールされていたパッケージのリスト(A)を整形(全て最新版にするならバージョン外す)し、npmでグローバルにインストール。

例) `npm install -g @wordpress/env eslint firebase-tools gulp-cli http-server npm npm-check-updates typescript yarn`

脆弱性があるパッケージを修正
`npm audit fix`
(完全ではない。今回は開発環境で使うのでエラーが出ててもう動けば良しとする)

一応、現在インストールされているパッケージを確認
`npm list --depth=0 -g`

メモ：パッケージのインストール場所は、
~/.nodebrew/node/vx.x.x[バージョン]/lib/node_modules
※上の @wordpress/env のように、サブディレクトリ構成のものもある

メモ：node.js を移行後のバージョンに切り替えた状態で `nodebrew migrate-package vx.xx.xx(移行前のバージョン)` とすると、移行前バージョンでインストールしていたパッケージ群を現在のバージョンから使えるようにしてくれる。しかし、これは、`~/.nodebrew/node/vx.x.x(現バージョン)/lib/node_modules/` にハードリンク(エイリアス)を作成するというものであり、実ファイルをコピーしてくれるわけではないので、移行前のバージョンを削除すると使えなくなる。パスを通す必要がある(~/.nodebrew/node/vx.x.x/bin 中に反映)もあり、node_modules 中の各パッケージのディレクトリを新バージョンのそれにコピーするだけでは動作しない。パッケージごとにパスを通す作業を考えると、新規にインストールした方が楽という判断で完全に切り分けることにした。


## 使わなくなった  node.js の特定バージョンをアンインストール 

アップデートした場合、何か問題が起きた時に戻せるように元のバージョンはしばらく残しといた方が良いと思う。

動作が問題ないことを確認した上で、不要となったものを削除
`nodebrew uninstall v16.4.2`
`nodebrew clean v16.4.2`

削除後残ってるゴミファイルがないかどうかの確認は
`~/.nodebrew/src/`と `~/.nodebrew/node` を確認(`nodebrew ls` の出力と比較)


## メモ

### 一時的に特定のバージョンを使う

あるスクリプトを「一時的に」特定のバージョンで実行したい場合
(例：app.js を v16.4.2 で実行。もちろん、v16.4.2 がインストールされた状態で)
`nodebrew exec v16.4.2 -- node app.js`

### nodebrew のアンインストール・入れ直し

`nodebrew コマンド` としても反応が無くなり（エラーは出ない）ハマった時があった。
一旦アンインストールして入れ直そうと .nodebrew ディレクトリを削除し、上記インストールのワンライナーを実行してもインストールできなかった。
[git.io/nodebrew](git.io/nodebrew)をホームディレクトリにダウンロード、`perl nodebrew setup` で入れ直すことができた。完了後、ダウンロードした git.io/nodebrew は削除。


## 参考サイト

* [hokaccha/nodebrew - Github](https://github.com/hokaccha/nodebrew)
* [node.js の環境管理ツール nodebrew - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/20120224/1330035058)
* [PATHを通す方法 - Memo on the Web](http://motw.mods.jp/Mac/PATH.html)
* [Mac OS X から Node.js をアンインストールする方法 - SONICJAM Developerz Blog](http://d.sonicjam.co.jp/post/52541343939)
* [PATHを通す - Qiita](http://qiita.com/zasso/items/021b3e4020c3c7e78bfc)
* [MacでPATHを通す（ユーザー単位 or 全ユーザー）- 5log](http://5log.jp/blog/path/)
* [node.jsのversionを管理するためにnodebrewを利用する - Qiita](http://qiita.com/sinmetal/items/154e81823f386279b33c)
* [MacのローカルにnodebrewでNode＆npmをインストール - Qiita](http://qiita.com/kijitoraneko/items/d456c056fa4a49641c1d)