nvmで64bit版と32bit版のNodeを共存👯‍♂️

# はじめに
先日の記事で、Node.jsの32bit版が必要だったのでインストールした話を書きました。何かを見て、**32bit版と64bit版は共存可能と思っていましたが**、[Node.jsの公式サイト](https://nodejs.org/ja)にある通常のインストーラーを使うと、前にインストールされているものはアンインストールされ、新しくインストールするものに綺麗に置き換わっていることがわかりました。32bit→64bitでも、64bit→32bitでも同じ。私はインストール時にフォルダ名を変えたりしてたけど、しっかり消えていたし、パスもお掃除されていました。**インストーラーが賢く、共存できません**。

https://qiita.com/yo16/items/1046f0839ea321cef565

ということで、**Nodeのバージョン管理プログラムのnvmを使って共存させる**ことにしました。ここでは、そのインストールと、使い方などを説明します。

**とにかくnvmの使い方だけ知りたい方**は、[4. nvm周辺でよく使うコマンド](#4-nvm周辺でよく使うコマンド)へどうぞ。

# nvmとは
**nvm**（Node Version Manager）は、Node.jsの複数のバージョンを簡単にインストール・切り替えできるコマンドラインツールです。主に開発環境で、異なるプロジェクトごとに適切なNode.jsのバージョンを管理するために使用されます。

https://github.com/coreybutler/nvm-windows

# nvmのインストール
## 1. githubからインストーラーをダウンロード
- [Releases · coreybutler/nvm-windows](https://github.com/coreybutler/nvm-windows/releases)
- 今回私がダウンロードしたバージョンは、1.2.2

## 2. インストーラーを実行
- パスはそのまま
    1. nvmのインストール先
    1. Nodeの各バージョンのシンボリックリンクを置くフォルダ（詳細は後述）
- デスクトップ通知もそのまま
- Emailは空欄
- インストールされ、PowerShellが開く
    - `nvm version`と打ってみる
        - まさかのnvmが存在しないエラー
        - なんのために開くの
- PowerShellを閉じて、自分でPowerShellを起動
    - `nvm version`と打ってみる
        - `1.2.2`→OK
        - ・・・まぁいいけど

## 3. シンボリックリンクの話
### 3.1. そもそもシンボリックリンクとは
「シンボリックリンク」はWindowsではあまり出てきませんが、Linuxの話ではよく出てきます。でもWindowsにも実はきちんと実装されています。ショートカットのようなもので、あたかもそこに存在しているかのように動作させられます。

「親フォルダ＞子フォルダ＞プログラム」というフォルダにプログラムがあるとしたいとき、「子フォルダ」が全然別の場所にあっても、子の「シンボリックリンク」を親フォルダに作っておくと、子フォルダがあるかのようにアクセスできる、というもの。

### 3.2. nvmでのシンボリックリンクの使い方
nvmでは
1. まず、使いたいNodeのバージョンをインストールします
2. つぎに、インストール済みのNodeのバージョン（複数）の中から、「このバージョンを使う！」と指定します
3. そうすると、コマンドで`node`と打った時に、指定したバージョンが動きます

これを実現するために、「シンボリックリンク」を使っています。nvmをインストールしたときに指定した２つのパス（①nvmのインストール先と、②シンボリックリンクのパス）で、**①には様々なバージョンのNode** がフォルダを分けて格納され、**②に今使うバージョンの「シンボリックリンク」** が格納されます。

nvmでは、「このバージョンを使う！」と指定したら、「シンボリックリンク」が作り直されます。

Nodeを実行するときはいつも`C:\nvm4w\nodejs\node.exe`と呼ぶんだけど、`nodejs`がシンボリックリンクで、どこかのバージョンのフォルダを指している、という仕組みです。

実行に関しては、割と単純な仕組みだと思います。（バージョン情報の管理とか、インストールの仕組みとか、大変な部分も多いと思いますが）

## 4. nvm周辺でよく使うコマンド
### 4.1. 各バージョンのNodeをインストール
- `nvm list available`
	- インストールできるバージョンのリスト表示
- `nvm install 22.13.1`
	- バージョンを指定してインストール
- `nvm install 22.13.1 32`
	- 32bit版の22.12.0をインストール
	- 指定しないときは、OSに沿う（今どき普通は64bit）
- `nvm install 22.13.1 all`
	- 64bit版と32bit版の両方ともインストール
	- （2025/1/25 v1.2.2で、うまく動かないかも）
- `nvm install lts`
    - LTSを（バージョンの数値は調べず）インストール

### 4.2. バージョンを選んで使う
- `nvm list`
	- インストール済みのバージョンをリストアップ
	- `use`で指示できるバージョン
- `nvm use 22.13.1`
	- 指定したバージョン（ここでは22.13.1）を使う
	- シンボリックリンクが作られる
- `nvm use 22.13.1 32`
	- 32bit版の指定したバージョン（ここでは22.13.1）を使う
	- （2025/1/25 v1.2.2で、うまく動かないかも）
- `node -p "process.arch"`
	- 今動いている`node`が、32bit版か64bit版かを表示
	- 64bit版のとき: `x64`
	- 32bit版のとき: `ia32`
- `nvm off`
	- シンボリックリンクを消す（`node`が使えなくなる）
	- 使う場面はよくわからない、誤作動防止？

### 4.3. "うまく動かないかも"について
64bit版と32bit版、両方とも最新のバージョンを使おうと、`all`でインストールしてみたのですが、`use`のとき、こんなエラーメッセージが。

```powershell
PS C:\Users\myname> nvm use 22.13.1 32
activation error: Did you mean node v22.13.1 (32-bit)?
If so, type "nvm use 22.13.1 32" to use it.
```

目をこすって確認しましたが、コピペで実行しても同じなので、私の間違いではないのでしょう。原因はわかりません。32bit版がインストールされていないか、`all`でも実は共存できないか、切り替えができないか、、、。

対策として、１つ前のLTSのバージョンである`22.12.0`は32bit指定でインストール（`nvm install 22.12.0 32`）したら、`nvm use 22.12.0 32`でうまくいきました。今はバージョンにこだわりがあるわけではないので、とりあえずそれでいいやと。

# 5. nvmで切り替えずに、32bit版を使う
切り替え方はわかったけど、私が先日やりたかった環境は、サーバーのexpress.jsは32bit版で、クライアントのReactは64bit版。それを１台のパソコンで。

そうすると、ローカルで両方のバージョンを同時に実行できないといけなくて、シンボリックリンクで切り替える方法では無理。

ということで、`nvm use`では通常使う64bit版にしておき、クライアントはそれを使う。サーバーの32bit版は、シンボリックリンク先のフォルダへ直接PATHを設定したら動きました。
`$env:Path = "C:\Users\myname\AppData\Local\nvm\v22.12.0;$env:Path"`

どっちみち、単純に複数インストールして共存できるならこの方法だったので、ちょっと遠回りして、便利ツール(nvm)を知って、元の位置に戻ったという感じ。特別効率よくなったわけではありませんが、**共存できなかったものを共存できるようになった**ということでよしとします。

# おわりに
32bit版を入れてパスを確認したら、64bit版のパスが消えていて64bit版が動くなったことに実は気づいてました。でもプログラム自体はあるだろうと思って、確認せず後回しにしてました。後で確認してみるとなくて、64bit版をインストールし直したら、32bit版がなくなったということで、今回の話でした😇

こういうことは、ちょっとした知識があるとなんとかクリアできるけど、躓く人は多いんだろうなぁと思いました。（でも32bit版や複数バージョンをインストールしようとする人は、その知識がない人はいないか）

AIでいろいろできるようになりつつある中、こういうトラブルもそのうち解消できるんでしょうか。こういう個別の事情みたいな話は、今はまだちょっと解決できる気がしません。動かなくなったプログラムに対して「🤖いい感じにOSの設定を変更して修復しておきました～」と言われるのも気持ち悪すぎる。でもそうなるのかなぁ。なるんだろうなぁ。


では、よきハンドメイド共存ライフを～👯‍♂️