科普文:用锈化的 fnm 管理 Node.js 版本

科普文:用锈化的 fnm 管理 Node.js 版本

前言

如今的 Node.js 社区有越来越多的基础软件有了新的替代品。记得在 2019 年的时候,曾写过一篇 《科普文:使用 nvs 管理本地 Node.js 版本》,时过境迁,我已经切换到 fnm 好长一段时间了,是被 @alsotang 安利的,但好像没看到知乎有什么讨论,于是顺手写篇科普分享下。


fnm 是什么?

fnm: Fast and simple Node.js version manager, built in Rust.

类似 nvmnnvs 这些一样,fnm 也是用来管理本地的 Node.js 版本的:

  • 当 Node.js 发布新版本后,希望能一键升级,并快速切换。
  • 不同的应用目录希望能使用特定 Node.js 版本。


fnm 的特点是:

  • 跨平台,支持 macOS、Windows、Linux。
  • 使用 Rust 编写,速度快。发布为单文件,便于安装。
  • 支持按应用自动切换 Node.js 版本。



如何安装?

macOS 和 Linux 系统

# 一键安装
$ curl -fsSL https://fnm.vercel.app/install | bash

macOS 也可以直接 brew install fnm安装,但需要配置 Shell 环境:

# 若自行安装,则需手动添加到 .zshrc 或 .bashrc
eval "$(fnm env --use-on-cd)"

Windows 系统

可以直接访问 Releases 下载对应的 exe 文件,也可以通过 Scoop 或 Chocolatey 等工具来安装。 然后也需要配置对应的命令行环境,参考文档来配置对应的 CMD、PowerShell、WSL2 等终端。

建议开发者尽量在 Windows 下使用 Linux on Windows with WSL2,能避免非常多的问题。


更多安装方式参见官方文档

使用指南

QuickStart

# 1. 安装最新的 LTS 版本
$ fnm install --lts
Installing Node v18.12.1 (arm64)

# 2. 设置为全局默认版本
$ fnm default 18

# 3. 尽情使用吧~
$ node -v
PS:永远记得不要安装单数版本,尽量用最新的 LTS 版本

常用指令

# 安装其他版本
$ fnm install 16

# 在当前 Shell 使用指定版本
$ fnm use 16

# 查看本地已安装的版本
$ fnm ls

# 查看官方已发布的所有版本
$ fnm ls-remote | grep v16

# 速度慢的时候,可以切换到国内源
$ fnm install 16 --node-dist-mirror=https://npmmirror.com/mirrors/node

使用不同的版本

  • 设置全局默认版本:
# 设置为全局默认版本
$ fnm default 18
  • 在当前 Shell 使用指定版本:
# 在当前 Shell 使用指定版本
$ fnm use 16
  • 使用指定版本来执行某个全局命令:
# 使用指定版本来执行某个全局命令
$ fnm exec --using=18 node -v
  • 在特定目录自动切换版本,也可以提交到源码库方便协作。
# 在应用目录写入文件,指定特定版本
$ echo '16' > .node-version

共享 npm 全局模块

fnm 会把不同版本的 Node.js 安装到特定目录,然后通过 PATH 环境变量方式切换。

$ which node

/Users/tz/Library/Caches/fnm_multishells/64059_1669472926310/bin/node

$ fnm exec --using=16 which node

/Users/tz/Library/Application Support/fnm/node-versions/v16.18.1/installation/bin/node

从而会带来一个问题:切换版本后,全局的命令模块需要重新安装,非常不方便。

解决方案是:配置统一的全局模块安装路径,如下:

$ mkdir -p ~/.npm_global
$ npm config set prefix ~/.npm_global

还需配置对于的 Shell 环境变量,如:

$ echo "export PATH=~/.npm_global/bin:$PATH" >> ~/.zshrc
$ source ~/.zshrc

需注意的是,如果你的全局命令是依赖于特定版本的 Addon 模块,则需要视情况重新安装。


相关阅读


我是持续关注 Node.js 领域的 天猪,欢迎关注我的专栏和 GitHub:github.com/atian25
编辑于 2022-12-05 22:24・IP 属地广东