Ubuntuでnvmを使ったnodeのversion管理

過去のブログ「初めてのプログラミング学習」でnode.jsの公式サイトから圧縮ファイルをダウンロードして、適当なフォルダで解凍する方法を紹介しました。

この方法がダメという訳でもないですが、最近は nvm(Node Version Manager) を使う方法が主流みたいで、過去のブログ記事の修正の意味も込めてご紹介します。これにより開発効率と保守性の大幅な改善が期待できます。

ここではUbuntu 22.04を例に紹介しますが、Debian Linux 12でも同様な方法で可能です。

nvmのメリット

  1. 複数バージョンの切り替えが簡単
    プロジェクトごとに必要なNode.jsのバージョンを変えたい時でも簡単にできる。
    nvm user <version>で簡単に切り替えられる。これは便利!
  2. グローバル環境を汚さない
    nvmはユーザーのホームディレクトリ内で完結する。手動インストールだと グローバル環境(/usr/local/bin)に直接入るから、他のツールと競合しやすいというデメリットがない。
  3. LTSや最新安定版のインストールが簡単
    nvm install <version>で簡単にインストールできる。
  4. npmも自動で連動する
    node.jsのバージョンを切り替えると、それに対応したnpmも一緒に切り替わる。素晴らしいですね。👏

グローバルでインストールしたnodeを削除する

まず、新たにインストールする前に、過去にインストールしたnode.jsを削除しないと、nvmの動作やバージョン切り替えに干渉する可能性がありますので、削除するところから始めます。

実行ファイルの場所確認と削除方法

node -v
 v22.13.1

npm -v
  11.3.0

which node
  /opt/node-v22.13.1/bin/node

これは、Node.js の公式サイトからダウンロードしたバイナリを手動で /optディレクトリに展開しただけなので、フォルダ毎削除すればOKです。...①

パス設定していれば、該当部分を削除するかコメントアウトしてから、以下のコマンドを実行してください。...②

# ①フォルダ毎削除
sudo rm -rf /opt/node-v22.13.1

# ②(.bashrcか.zshrcに)パス指定していると思うので、削除します。
sudo vim .bashrc
# --ファイルの中身抜粋 --
PATH="/home/tatsumi/.local/bin:
/opt/node-v22.13.1/bin: ←これを削除する
/usr/local/sbin:..省略.."
# -- :wqで保存して抜ける --

# 最後に、source ~/.bashrcを実行する。
source ~/.bashrc

他に無いか確認すると、version 18が残っていました。

さらに確認と他にあればこれも削除

node -v
 v18.17.1  # まだ残っている

# aptでインストールしたのか、覚えていない。
which node
  /usr/local/bin/node
  
# ディレクトリを探す→フォルダに移動して、list表示で確認する。
pwd
/usr/local/bin

ls -al 

lrwxrwxrwx  1 root    root          27  8 12  2021 n -> ../lib/node_modules/n/bin/n
-rwxr-xr-x  1 root    root    92150296  9  9  2023 node

これらも削除します。

# 削除
sudo rm /usr/local/bin/n
sudo rm /usr/local/bin/node
# リンク先も削除
sudo rm /usr/local/lib/node_modules/n/bin/n

# 確認
node -v
bash: /usr/local/bin/node: そのようなファイルやディレクトリはありません
npm -v
/usr/bin/env: `node': そのようなファイルやディレクトリはありません

nvmのインストール

Ubuntu 22.04にnode.jsの公式サイトからnvmをインストールします。

nvmインストールとnode-versionのインストール実行結果

# ホームに移動して
# install 
sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 
# ..中略..
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# 指示通りに行う
# ①
export NVM_DIR="$HOME/.nvm"

# ②
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 

# ③
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" 

# 最後にインストールされたか確認する
nvm -v
0.40.3

# install
nvm install 24.11.0

nvm install 22.21.1

node.jsのVersionを簡単に切り替える2つの方法

一時的に切り替える

nvm use <version>で切り替え可能。但しこれは一時的な切り替えで、ターミナルを閉じるだけで、もとのdefault versionに戻ります。

# install versionを確認
 nvm ls
->     v22.21.1
       v24.11.0
default -> 22.21.1 (-> v22.21.1)

node -v
  v22.21.1

npm -v
  10.9.4

# ここで切り替える
nvm use 24.11.0
  Now using node v24.11.0 (npm v11.6.1)
  
node -v
  v24.11.0  # 切り替えられた!!
  
# ターミナルを閉じて、別のターミナルで確認すると、defaultのv22.21.1に戻っていました。
#  これが正常な動作ですので、安心してください。
node -v
 v22.21.1

nvm ls
->     v22.21.1
       v24.11.0
default -> 22.21.1 (-> v22.21.1)
永続的に切り替える

nvm alias default <version> で行います。別のターミナルを開いて

nvm ls
->     v22.21.1
       v24.11.0
default -> 22.21.1 (-> v22.21.1)

# これで新しいターミナルを開いたときに自動的に22.21.1に切り替わるので、
# 永続的に切り替えるために、下記のコマンドを実行します。
nvm alias default 24.11.0
# 別のターミナルを開いて確認すると、24.11.0に固定されています。
node -v
 v24.11.0

nvm ls
       v22.21.1
->     v24.11.0
default -> 24.11.0 (-> v24.11.0)

# 何度でも上書きできるので、再度変更すると。
nvm alias default 22.21.1
 default -> 22.21.1 (-> v22.21.1)

nvm use 22.21.1
Now using node v22.21.1 (npm v10.9.4)

# 同じターミナルで確認しても v22.21.1に変更
node -v
v22.21.1

# ここでターミナルを閉じて、別のターミナルを開いて確認すると、同じv22.21.1のままでした。
node -v
 v22.21.1
削除する方法

これも簡単で、nvm uninstall <version> で不要なバージョンを削除できる!!

# 例えば
nvm uninstall 20.19.5  

npmのみアップグレードする

nvmではNode.jsのバージョンに紐づいてnpmも一緒にインストールされますので、npmのみUpgradeするのは稀かもんしれませんが、npm単体のバージョンだけをアップグレードしたい場合は、以下のように手動で行う必要があります。

npmだけをアップグレードするコマンド

npm install -g npm@latest

現在アクティブなNode.jsバージョンに紐づくnpmだけが更新されます。

ここで、オプションの -g はglobalのgなので、グローバル環境に影響されると思ってしまいますが、現在アクティブな Node.js バージョンの環境内でグローバルという意味です。

今Node.jsはnvmで管理していますので、切り替えたNode.js環境内でグローバルに影響しますが、他のNode.jsバージョンには影響しません。

⇨ これでnode.jsのバージョンの違いで動作しないアプリがあっても、グローバル環境を汚さずに、安心して対応できますので、とても便利です。😀

以上です。

Follow me!