使用fnm管理node版本


前言

全面提到了 fnm + corepack + pnpm 的使用,这就先说说 fnm ,管理 node 的版本。corepack 使用 node 自带的,pnpm 用来管理全局安装的包。

安装

  • macOS: brew install fnm
  • windows: scoop install fnm

shell 配置

fnm completions --shell <SHELL>

windows 下, 要注意配置文件的是在 %USERPROFILE% 目录下, 就是下面的 ~ 目录, 并且区分 PowerShell 版本,区分文件路径:

  • Built in PowerShell (aka “Windows PowerShell”): ~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
  • The newer, PowerShell >= 7, that’s not built in: ~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

使用

  • fnm list: 本地有哪些版本
  • fnm ls-remote: 远程有哪些版本
  • fnm current: 当前使用的版本
  • fnm version: 查看 fnm 版本
  • fnm install: 安装指定版本, 比如 fnm install --lts
  • fnm use: 使用指定版本, 比如 fnm use 14.17.0
  • 项目或目录配置了 .node-version 或者 .nvmrc, 使用 fnm use 切换

全局包管理

  • 如果包有其他的包管理安装方式, 比如 scoop, homebrew, 那就统一使用其他的软件包管理。
  • pnpm install -g 安装, pnpm 不会随着切换版本, 切换安装路径, 都在 ~/Library/pnpm
  • 推荐 nlx 的方式,临时安装并使用。

退出目录,自动切换

需要借助 add-zsh-hook, 在 .zshrc 中配置:

autoload -U add-zsh-hook
load-nvmrc() {
  DEFAULT_NODE_VERSION=`$FNM_DIR/aliases/default/bin/node -v`
  if [[ (-f .nvmrc && -r .nvmrc) || (-f .node-version && -r .node-version) ]]; then
    fnm use --install-if-missing --silent-if-unchanged
  elif [[ `node -v` != $DEFAULT_NODE_VERSION ]]; then
    echo Reverting to node from "`node -v`" to "$DEFAULT_NODE_VERSION"
    fnm use $DEFAULT_NODE_VERSION
  fi
}
add-zsh-hook chpwd load-nvmrc

技术总结

可替代 volta 管理 node 版本, 配合 corepack 管理包管理工具。