はじめに
Node.jsのバージョン管理、nvmを使っている人は多いと思います。正直なところ、nvmで特に困っていないという人もいるでしょう。
ただ、一点だけ気になることがあって。
ターミナルを開くたびに、nvmの読み込みで微妙に待たされるんですよね。
新しいタブを開いて、すぐにコマンドを打ちたいのに、0.5秒くらいのラグがある。これが積み重なると、地味にストレスになります。
そんな悩みを解決してくれるのがfnm(Fast Node Manager)です。
GitHubスターは22,900を超えていて、Rust製で爆速。クロスプラットフォーム対応なので、macOSでもWindowsでもLinuxでも同じように使えます。
fnmとは
fnmは「Fast Node Manager」の略で、Rustで実装されたNode.jsバージョン管理ツールです。
nvmと同じように複数のNode.jsバージョンをインストール・管理・切り替えできますが、決定的に違うのは速度。起動時間がほぼゼロに近い。ターミナルを開いた瞬間から使えます。
特徴的なのは、単一のバイナリファイルで動作すること。シェルスクリプトではなくネイティブバイナリなので、起動が速いのは当然といえば当然。
また、.nvmrcファイルにも対応しているので、nvmから移行しても既存のプロジェクト設定がそのまま使えます。これ、意外と重要なポイント。
特徴・メリット
起動が爆速
これがfnmを選ぶ最大の理由。シェルの起動時間がほとんど増えません。
nvmは読み込みに数百ミリ秒かかることがありますが、fnmは数ミリ秒。体感で明らかに違います。ターミナルをよく開く人ほど、この差が効いてきます。
クロスプラットフォーム対応
macOS、Linux、Windowsすべてで動作します。
個人的にはここが嬉しいポイント。会社のPCがWindowsで、自宅のMacと同じツールを使いたいという状況、けっこうあるんですよね。nvmはWindowsネイティブでは動かないので、nvm-windowsという別ツールを使う必要がありました。fnmなら一本で済みます。
.nvmrcと.node-versionに対応
既存のプロジェクトで.nvmrcを使っている場合も、そのまま移行できます。.node-versionファイルにも対応しているので、他のツールとの互換性も高い。
チームメンバーがnvmを使っていても、自分だけfnmを使うことが可能。バージョン指定ファイルは共通なので、問題になりません。
インストールが簡単
単一ファイルなので、インストールがシンプル。Homebrewでも、公式スクリプトでも、Cargoでも、好きな方法でインストールできます。
自動バージョン切り替え
ディレクトリ移動時に自動でNode.jsバージョンを切り替える機能が組み込まれています。nvmでは自分でスクリプトを書く必要がありましたが、fnmはオプション一つで有効化できます。
インストール方法
環境に合わせて、好きな方法でインストールできます。
macOS / Linux(スクリプト)
curl -fsSL https://fnm.vercel.app/install | bash
Homebrew(macOS / Linux)
brew install fnm
Windows(winget)
winget install Schniz.fnm
Windows(Scoop)
scoop install fnm
Windows(Chocolatey)
choco install fnm
Cargo(Rust環境がある場合)
cargo install fnm
シェルの設定
インストール後、シェルの設定ファイルに以下を追加します。
Bash(.bashrc)
eval "$(fnm env)"
Zsh(.zshrc)
eval "$(fnm env)"
Fish(config.fish)
fnm env | source
PowerShell
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
設定後、ターミナルを再起動するか、設定ファイルを再読み込み:
source ~/.bashrc # bashの場合
source ~/.zshrc # zshの場合
確認
fnm --version
バージョンが表示されればOK。
基本的な使い方
nvmとほぼ同じコマンド体系なので、移行しやすいです。
Node.jsのインストール
# 最新のLTSをインストール
fnm install --lts
# 特定バージョンをインストール
fnm install 20.10.0
# メジャーバージョン指定
fnm install 20
バージョンの切り替え
# 特定バージョンに切り替え
fnm use 20
# LTSに切り替え
fnm use --lts
# .nvmrcに書かれたバージョンに切り替え
fnm use
インストール済みバージョンの一覧
fnm list
こんな感じで表示されます:
* v20.10.0 default
* v18.19.0
* v22.0.0
リモートで利用可能なバージョン一覧
fnm list-remote
デフォルトバージョンの設定
fnm default 20
新しいターミナルを開いたときに、このバージョンが使われます。
現在のバージョン確認
fnm current
実践的なユースケース
自動バージョン切り替え
fnmの強力な機能の一つ。シェル設定で--use-on-cdオプションを有効にすると、ディレクトリ移動時に自動でバージョンが切り替わります。
# .zshrcの設定
eval "$(fnm env --use-on-cd)"
これでプロジェクトディレクトリに.nvmrcや.node-versionがあれば、cdするだけで自動的にバージョンが切り替わります。nvmで自前のスクリプトを書いていた人は、この機能だけでも移行する価値がありますね。
プロジェクトごとのバージョン固定
# プロジェクトルートでNode.jsバージョンを記録
node --version > .node-version
または、nvmと互換性を保つなら:
echo "20.10.0" > .nvmrc
チームメンバーがnvmを使っていても、自分はfnmで高速に切り替え可能。
Windowsでの開発
これまでWindowsでNode.jsのバージョン管理をしようとすると、nvm-windowsを使うしかありませんでした。でも、nvm-windowsはオリジナルのnvmとは別プロジェクトで、微妙にコマンドが違ったりします。
fnmならmacOSと同じコマンドがそのまま使える。複数の環境で開発している人には、これがかなり嬉しい。
Fishシェルユーザー
nvmはFishシェルに対応していませんが、fnmは対応しています。Fishを使っているなら、fnm一択ですね。
# config.fish
fnm env --use-on-cd | source
nvmからの移行
既存のnvm環境からの移行は簡単です。
- fnmをインストール
- シェルの設定ファイルからnvmの設定を削除(またはコメントアウト)
- fnmの設定を追加
- 使いたいNode.jsバージョンを
fnm installで再インストール
.nvmrcファイルはそのまま使えるので、プロジェクト側の変更は不要。
注意点
グローバルパッケージは引き継がれない
fnmでNode.jsをインストールし直すと、nvmで入れていたグローバルパッケージは引き継がれません。必要なものは再インストールしてください。
npm install -g pnpm yarn typescript
nvmとの共存は避ける
両方を有効にしていると、どちらが有効かわかりにくくなります。移行するなら、nvmの設定は無効化しておきましょう。
まとめ
fnmは「nvmの高速版」という位置づけのツールです。
- Rust製で起動が爆速
- クロスプラットフォーム対応(Windows含む)
.nvmrc互換で移行が簡単- 自動バージョン切り替え機能内蔵
- Fishシェル対応
正直なところ、nvmで満足しているなら無理に移行する必要はありません。でも、ターミナルの起動時間が気になる人、Windowsでも同じツールを使いたい人、Fishシェルユーザーには、fnmをおすすめします。
30代になって思うのは、小さなストレスの積み重ねがけっこう効くということ。ターミナルを開くたびに0.5秒待たされるのと、即座に使えるのでは、1日の終わりに感じる疲労感が違います。
インストールは5分で終わるので、試してみる価値はあると思いますよ。