はじめに
「このプロジェクトはNode.js 18系、こっちは20系」——複数のプロジェクトを掛け持ちしていると、Node.jsのバージョン管理は避けて通れない悩みになります。定番のnvmはシェル関数として動作し、ターミナルを開くたびに読み込み処理が走るため、シェル起動が少し重くなったり、CIやDockerイメージの中で挙動が安定しなかったりすることがあります。
そこに一石を投じるのが、TJ Holowaychuk氏が開発したnです。READMEには「no subshells, no profile setup, no convoluted API, just simple」という一文が掲げられており、その名の通り余計な仕組みを持ち込まずにNode.jsのバージョンを切り替えられます。
この記事では、nの特徴からインストール、日々のバージョン切り替えの実践的な使い方までを紹介します。
Nとは
nは、Node.js本体を使ってNode.jsのバージョンを管理するCLIツールです。シェル関数を経由せず、ダウンロードしたバイナリを直接/usr/local配下などに配置する方式を採っているため、nvm useのようにシェルごとにバージョンを切り替える必要がなく、システム全体で使うNode.jsのバージョンをシンプルに切り替えられます。
npmパッケージとして配布されているため、Node.jsさえ入っていればnpm install -g nの一行で導入できるのも特徴です。
主な特徴
- サブシェル不要 -
nvmのようにシェル関数として.bashrcや.zshrcに設定を追加する必要がなく、インストールしたその場から使えます - インタラクティブな選択UI -
nとだけ打つと、ダウンロード済みバージョンの一覧が矢印キーで選べるインタラクティブメニューとして表示されます - キャッシュ管理 - 一度ダウンロードしたバージョンはキャッシュされ、切り替え時の再ダウンロードが発生しません
- 柔軟なバージョン指定 -
n lts(最新LTS)、n latest(最新版)、n 18.20.4(特定バージョン)など、目的に応じた指定方法が用意されています
インストール
Node.jsとnpmがすでに環境にある場合は、以下のコマンドでグローバルインストールできます。
npm install -g n
Node.jsをまだ入れていない環境では、curlでインストールスクリプトを取得して導入する方法も公式に案内されています。
curl -L https://raw.githubusercontent.com/tj/n-install/master/bin/n-install | bash
macOSでHomebrewを使っている場合は、以下でも導入可能です。
brew install n
基本的な使い方
nはCLIツールとしてNode.jsのバイナリを直接切り替える性質上、ブラウザ上での実行サンプルは提供できません。ここではターミナルでの実際のコマンド例を紹介します。
もっともよく使うのは、引数なしでnを実行する方法です。ダウンロード済みのバージョンがあれば、インタラクティブなリストが表示され、矢印キーとEnterで切り替えるバージョンを選べます。
# ダウンロード済みバージョンから選んで切り替える
n
特定のバージョンを指定してインストール・切り替えを一度に行うこともできます。
# LTS版の最新をインストールして切り替える
n lts
# 最新版(Current)に切り替える
n latest
# バージョンを直接指定する
n 20.11.1
現在使用中のバージョンを確認するには--versionではなく、単にnode -vを使います。n自体のバージョンを確認したいときは以下の通りです。
n --version
実践的なユースケース
プロジェクトごとにバージョンを切り替える
複数のリポジトリを行き来する開発では、リポジトリごとに想定しているNode.jsのバージョンが異なることがよくあります。package.jsonのenginesフィールドで指定されたバージョンに合わせて、都度nで切り替えるという運用が基本形です。
# package.json の engines.node を確認してから
cat package.json | grep -A 1 '"engines"'
# 指定されたバージョンに切り替える
n 18.20.4
# 切り替わったことを確認
node -v
nvmのように.nvmrcを自動で読み込む機能はn本体には無いため、チームでバージョンを揃えたい場合はn auto(package.jsonのenginesを見て自動インストール・切り替え)を使うか、READMEにある運用に沿ってenginesフィールドを整備しておくのがおすすめです。
不要になったバージョンを整理する
バージョンを切り替えながら開発していると、使わなくなった古いバージョンがディスクに溜まっていきます。n lsでインストール済みバージョンの一覧を確認し、n rmで不要なものを削除できます。
# インストール済みのバージョン一覧を表示
n ls
# 特定バージョンを削除
n rm 16.20.2
# n が管理しているキャッシュ・バイナリをまとめて確認
n which 20.11.1
ディスク容量が気になるCI環境や、検証用に一時的なバージョンだけ使いたい場面で、こまめにn rmしておくと管理がすっきりします。
スクリプトを特定バージョンで一発実行する
「このバージョンだけで動作確認したい」というときに、現在の設定を切り替えずに一時的に別バージョンで実行できるn execが便利です。CIのジョブや検証スクリプトの中で、グローバルなバージョンを変えずに済むため安全に使えます。
# Node.js 20 系で一時的にスクリプトを実行する
n exec 20 node script.js
# 特定バージョンで npm コマンドを実行する
n exec 18 npm test
n execは指定したバージョンが未インストールであれば自動でダウンロードしてから実行してくれるため、CIのマトリクステストなどでバージョンごとの動作確認を行う際にも重宝します。
まとめ
nは、「Node.jsのバージョン管理はもっとシンプルでいい」という思想をそのまま形にしたようなツールです。シェル関数に頼らずバイナリを直接切り替える設計により、nvm特有のシェル起動時のオーバーヘッドや設定の煩雑さから解放されます。
インタラクティブなバージョン選択、n execによる一時実行、n rmによるキャッシュ整理と、日々の開発で必要な操作がひと通り揃っているのも魅力です。複数のNode.jsバージョンを行き来する開発者は、一度npm install -g nで試してみる価値があります。