什么是fnm?
fnm(Fast Node Manager)基于 Rust 开发,它是跨平台的,支持 macOS、Linux、Windows。
🚀 Fast and simple Node.js version manager, built in Rust.
安装fnm
以macOS为例,推荐使用Homebrew,Windows平台推荐使用Scoop。
brew install fnm
配置所需要的变量到当前的shell环境中,以zsh为例。
fnm env --use-on-cd >> ~/.zshrc
使用fnm
使用fnm安装Node
# 安装 LTS 版本
fnm install --lts
# 安装指定大版本的最新版本
fnm install 18
# 安装指定版本
fnm install 18.21.1
相反地,可通过 fnm uninstall或 fnm uninstall 来删除指定版本,后者会同时移除别名。
使用fnm切换Node版本
# 使用系统版本
fnm use system
# 使用 fnm 所安装,且版本号为 18.21.1 的 Node 程序
fnm use 18.21.1
# 使用 fnm 所安装,且主版本号为 18 的最新版本的 Node 程序
fnm use 18
只要用 fnm use指定后,每次启动 Shell 将会默认使用对应的 Node 版本。
设置别名
# 形式如:fnm alias <指定版本号> <别名>
fnm alias 18.21.1 v18
# 设置别名后,可以简化指令为:
fnm use v18
其实以上示例的别名意义不大,仅用于举例而已。原因是:在「不设置别名」的情况下,使用 fnm use 18,也能切换至 18.21.1。使用 fnm use
假设我们安装了 18.20.0 和 18.21.1 两个主版本号相同的 Node 程序,使用 fnm use 18 只会切换至 18.21.1(即最新的版本),尽管通过 fnm alias 18.20.0 18 将 18.20.0 的别名设为 18,这样设置别名是无意义的。
此时可能需要用 fnm use 18.20 或 fnm use 18.20.0 来切换指定版本了,或者其他非纯数字的别名了。
较有意义的特殊别名 system 和 default:
前者是以 .pkg 等形式(比如官网下载的安装包)所安装的 Node 应用程序,称为系统版本。
后者是用于指定 fnm 的一个默认版本,作为与 18 是类似的,只是其语义表示默认罢了。
# 指定默认版本
$ fnm default 18.21.1
# 相当于
$ fnm alias 18.21.1 default
相反地,可通过 fnm unalias
项目中指定特定版本
可以通过在项目根目录下添加 .node-version 或 .nvmrc 文件,并在其中指定版本。比如:
$ echo '18' > .node-version
前提是,配置 fnm 环境用的是 fnm env --use-on-cd 命令,而不是 fnm env。后者没有添加 Hook,因此不会是检查对应配置文件。有兴趣的可以对比两条命令的差别就明白了。
由于团队成员所安装的 Node,其次版本或补丁版本号可能是不一样的,因此,多数情况下指定主版本号即可,无需指定到 18.21.1 等更具体的版本号(特殊场景除外)。
卸载 fnm
若是通过 brew 安装的 fnm,则:
$ brew uninstall fnm
接着,再移除 ~/.fnm 目录。
$ rm -rf ~/.fnm
最后,移除 bash 或 zsh 的配置文件中与 fnm 相关的配置。比如:
export PATH="/Users/frankie/Library/Caches/fnm_multishells/49559_1670052262156/bin":$PATH
export FNM_VERSION_FILE_STRATEGY="local"
export FNM_DIR="/Users/frankie/Library/Application Support/fnm"
export FNM_NODE_DIST_MIRROR="https://nodejs.org/dist"
export FNM_MULTISHELL_PATH="/Users/frankie/Library/Caches/fnm_multishells/49559_1670052262156"
export FNM_ARCH="x64"
export FNM_LOGLEVEL="info"
autoload -U add-zsh-hook
_fnm_autoload_hook() {
if [[ -f .node-version || -f .nvmrc ]]; then
fnm use --silent-if-unchanged
fi
}
add-zsh-hook chpwd _fnm_autoload_hook &&
_fnm_autoload_hook
rehash