Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

再见 nvm,改用 fnm 了 #96

Open
toFrankie opened this issue Feb 25, 2023 · 0 comments
Open

再见 nvm,改用 fnm 了 #96

toFrankie opened this issue Feb 25, 2023 · 0 comments
Labels
2022 2022 年撰写 Mac 与 Mac、macOS 相关的文章 Node.js 与 Node.js、npm、yarn、pnpm 等相关的文章

Comments

@toFrankie
Copy link
Owner

toFrankie commented Feb 25, 2023

配图源自 Freepik

社区上用于管理 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.018.21.1 两个主版本号相同的 Node 程序,使用 fnm use 18 只会切换至 18.21.1(即最新的版本),尽管通过 fnm alias 18.20.0 1818.20.0 的别名设为 18,这样设置别名是无意义的。
此时可能需要用 fnm use 18.20fnm use 18.20.0 来切换指定版本了,或者其他非纯数字的别名了。

较有意义的特殊别名 systemdefault

  • 前者是以 .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

最后,移除 bashzsh 的配置文件中与 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
├── [email protected]
├── [email protected]
├── [email protected]
├── simple-shell@
└── [email protected]

移除 nvm 的安装目录,通常是 ~/.nvm。执行以下命令即可:

$ rm -rf "$NVM_DIR"

移除 bashzsh 的配置文件中与 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.

@toFrankie toFrankie added Mac 与 Mac、macOS 相关的文章 Node.js 与 Node.js、npm、yarn、pnpm 等相关的文章 labels Feb 25, 2023
@toFrankie toFrankie added the 2022 2022 年撰写 label Apr 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2022 2022 年撰写 Mac 与 Mac、macOS 相关的文章 Node.js 与 Node.js、npm、yarn、pnpm 等相关的文章
Projects
None yet
Development

No branches or pull requests

1 participant