Edited at

NVM の nvm.sh を遅延ロードしてシェルの起動を高速化する

More than 5 years have passed since last update.

NVM のインストール手順は .bashrc や .zshrc に source ~/.nvm/nvm.sh を記述するよう指示している。しかし nvm.sh は比較的複雑なので source に時間がかかり、インタラクティブシェルの起動がわずかに遅くなる。できればこのタイムロスをなくしたい。

nvm.sh の大半を占めるコードは nvm コマンドに関するものであるため、 nvm コマンドを実行するときに初めて nvm.sh をロードするようにしてみる。


.bashrc|.zshrc

# 仮の nvm コマンド

nvm() {
# まず仮の nvm コマンドを unset
unset -f nvm

# nvm.sh をロード
# ここで本物の nvm コマンドが定義される
source "${NVM_DIR:-$HOME/.nvm}/nvm.sh"

# 仮の nvm コマンドに渡された引数を本物に受け渡す
nvm "$@"
}


このままでは nvm コマンドを実行するまで Node が $PATH に追加されない。パスは .bash_profile または .zshenv で明示的にセットする。


.bash_profile|.zshenv

# あらかじめ `nvm default vX.Y.Z` してエイリアス "default" を作っておく

PATH=${NVM_DIR:-$HOME/.nvm}/default/bin:$PATH
MANPATH=${NVM_DIR:-$HOME/.nvm}/default/share/man:$MANPATH
export NODE_PATH=${NVM_DIR:-$HOME/.nvm}/default/lib/node_modules

# (以下 Zsh のみ)
# $NODE_PATH にバージョン番号が含まれていないと `yo doctor` が警告を出す
# 次のように書くと $NODE_PATH のシンボリックリンクが展開され、警告が出なくなる
# (Hint: .nvm/default は .nvm/vX.Y.Z へのシンボリックリンク)
NODE_PATH=${NODE_PATH:A}