再见 nvm,改用 fnm 了
社区上用于管理 Node 版本的工具很多,较为流行的有:
个人弃用 nvm 不是因为它不跨平台,而是启动 Shell 进程太耗时了... 加之它本身问题挺多的,详见:Important Notes。
对我最直接的影响是:此前那个 8G 运存的 MacBook Pro 打开 VS Code 的时候,总会因为 Shell 解析太久导致 VS Code 终止解析,最终造成了某些 Plugins(比如 Mercurial 相关插件)无法正常使用。此前吐槽过了,可移步文章:解决 Unable to resolve your shell environment in a reasonable time。
一、fnm 安装与使用
fnm(Fast Node Manager)基于 Rust 开发,是不是还没用就感觉到它的快了,哈哈~
同时,它是跨平台的,支持 macOS、Linux、Windows。
🚀 Fast and simple Node.js version manager, built in Rust.
1. 安装 fnm(以 macOS 为例)
$ brew install fnm
2. 配置 fnm 所需的环境变量到 bash 或 zsh 配置文件中,以 zsh 为例:
$ fnm env --use-on-cd >> ~/.zshrc
亦可执行 fnm env --use-on-cd
,将输出内容手动添加至 .bash_profile
或 .zshrc
里。
3. 用 fnm 安装 Node
# 安装 LTS 版本
$ fnm install --lts
# 安装指定大版本的最新版本
$ fnm install 18
# 安装指定版本
$ fnm install 18.21.1
相反地,可通过 fnm uninstall <version>
或 fnm uninstall <alias-name>
来删除指定版本,后者会同时移除别名。
4. 通过 fnm 来指定 Node 版本
# 使用系统版本
$ fnm use system
# 使用 fnm 所安装,且版本号为 18.21.1 的 Node 程序
$ fnm use 18.21.1
# 使用 fnm 所安装,且主版本号为 18 的最新版本的 Node 程序
$ fnm use 18
只要用 fnm use <version>
指定后,每次启动 Shell 将会默认使用对应的 Node 版本。
5. 设置别名
# 形式如:fnm alias <指定版本号> <别名>
$ fnm alias 18.21.1 v18
# 设置别名后,可以简化指令为:
$ fnm use v18
其实以上示例的别名意义不大,仅用于举例而已。原因是:在「不设置别名」的情况下,使用 fnm use 18
,也能切换至 18.21.1
。使用 fnm use <major>
会切换至对应主版本号对应的最新版本。
假设我们安装了
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 <alias-name>
来取消别名。
6. 项目中指定特定版本
可以通过在项目根目录下添加 .node-version
或 .nvmrc
文件,并在其中指定版本。比如:
$ echo '18' > .node-version
前提是,配置 fnm 环境用的是 fnm env --use-on-cd
命令,而不是 fnm env
。后者没有添加 Hook,因此不会是检查对应配置文件。有兴趣的可以对比两条命令的差别就明白了。
由于团队成员所安装的 Node,其次版本或补丁版本号可能是不一样的,因此,多数情况下指定主版本号即可,无需指定到 18.21.1
等更具体的版本号(特殊场景除外)。
7. 卸载 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
二、移除 nvm
在移除之前,通过以下方式查看使用 nvm
所安装的全局包,然后切换到 fnm
安装一下(有需要的话):
$ nvm use 16
Now using node v16.14.0 (npm v8.3.1)
$ npm list -g
/Users/frankie/.nvm/versions/node/v16.14.0/lib
├── corepack@0.10.0
├── npm@8.3.1
├── pnpm@7.5.0
├── simple-shell@
└── zx@7.0.7
移除 nvm
的安装目录,通常是 ~/.nvm
。执行以下命令即可:
$ rm -rf "$NVM_DIR"
移除 bash
或 zsh
的配置文件中与 nvm
相关的配置。比如:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --no-use # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
其他系统可看 Uninstalling / Removal。
其他
相关内容文章:
The end.