什么是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

https://www.jianshu.com/p/0843d55e044e

最后修改:2024 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏