fnm 快速上手:一款用 Rust 写的 Node.js 版本管理器,3 分钟配好自动切换
【免费下载链接】fnm🚀 Fast and simple Node.js version manager, built in Rust项目地址: https://gitcode.com/gh_mirrors/fn/fnm
同时维护几个前端项目时,你多半遇到过这种局面:A 项目跑 Node 16,B 项目必须用 20,打开终端得先回忆各项目要哪个版本,切完目录又容易忘记重新切换。fnm 是一个用 Rust 编写的 Node.js 版本管理器,它能读取项目目录里的.node-version文件并自动完成切换,让你少跑一条命令。读完本文,你会装好 fnm、配好 shell,并了解三个省掉手动切换的进阶配置。
fnm 是什么:3 个值得换过去的理由
- 单文件二进制,启动即就绪:fnm 不依赖任何 shell 脚本,一条命令装完就能用,新打开 shell 时几乎没有额外开销。如果你用过 nvm,知道每次启动 shell 都要加载一长串脚本,fnm 的做法是把它压缩成一个 Rust 二进制。
- 兼容 nvm 的项目约定:它识别
.node-version和.nvmrc文件,迁移不用改项目配置;目录里连这两个文件都没有时,默认还会读package.json的engines.node(可用--resolve-engines=false关闭)。 - 跨平台:macOS、Windows、Linux 都支持,bash、zsh、fish、PowerShell 均有对应的初始化方式。仓库的 benchmarks/ 目录里还附带了基于 hyperfine 的对比脚本(basic/fnm 对 basic/nvm),覆盖"安装 + 切换 + 验证"的完整流程,方便你自行验证。
从安装到第一次切换:只需 3 步
环境准备与安装
fnm 本身不需要 Node.js 环境,选一个你顺手的包管理器即可:
brew install fnm # macOS / Linux winget install Schniz.fnm # Windows cargo install fnm # 跨平台,需要 Rust 环境这些方式装出来的都是同一个单文件二进制,几秒即可完成;README 里还给了官方安装脚本和 release 二进制两种备选。
shell 初始化
fnm 通过fnm env输出一段环境配置,需要你的 shell 执行它。把下面这行写进~/.bashrc(zsh 用户把--shell zsh并写进~/.zshrc):
eval "$(fnm env --use-on-cd --shell bash)"这里有两个关键参数:显式传--shell可以跳过运行时的 shell 推断,更快也更稳;--use-on-cd会注册一个目录变更钩子,你每次cd进项目时自动切换对应版本,官方文档将其列为"强烈推荐",建议一开始就加上。
安装并切换第一个版本
fnm install 20 # 安装最新的 Node 20.x fnm use 20 # 当前 shell 切换到 20.x node -v # 确认生效版本号支持部分匹配:写20会解析到已知的最新 20.x,写完整版本号或lts/iron这类 LTS 名称也可以。
fnm 常用命令速查:8 条高频操作
| 命令 | 作用 | 备注 |
|---|---|---|
fnm install 20 | 安装最新 Node 20.x | 接受18、20.10.0、lts/NAME等形式 |
fnm install --lts | 安装最新 LTS 版本 | 等价于直接指定 LTS |
fnm use 20 | 当前 shell 切换到 20.x | 未安装时加--install-if-missing |
fnm use | 按当前目录版本文件切换 | 读.node-version/.nvmrc |
fnm ls | 列出本地已安装版本 | list的别名 |
fnm ls-remote --lts | 查询远端 LTS 版本 | 可加--filter 20做范围过滤 |
fnm default 20 | 设置默认版本 | 不带参数运行时显示当前默认 |
fnm exec --using=20 npm i | 用指定版本跑单条命令 | 不改变当前 shell 状态 |
进阶配置:3 个让你少动手的设置
monorepo 里的递归版本查找
默认情况下fnm use不带参数时只查当前目录(local策略),进子包目录就会报"找不到版本文件"。把初始化行改成:
eval "$(fnm env --use-on-cd --version-file-strategy=recursive --shell bash)"配完后,在repo/packages/my-package里执行fnm use,会向上找到仓库根目录的.node-version并切到那个版本,子目录工作不再需要单独放版本文件。
固定默认版本与版本别名
新开 shell 没有版本文件时,走的就是默认版本;再给常用版本起个名字,输入更短:
fnm default 20 # 默认版本设为 20.x fnm alias 20 work # 之后 fnm use work 即可切换别名用fnm unalias work删除。团队共享的版本名(如legacy、stable)起好后,新人照抄就行。
装版本时顺手启用 Corepack
fnm install --corepack-enabled --lts加上--corepack-enabled后,每次新装 Node 版本 fnm 都会替你执行corepack enable,省去手动开启 pnpm/yarn 的一步。官方标注该功能为实验性,介意的话可以保持默认关闭。
新手常见问题
- 新终端不认 fnm 命令,或 node 版本没变:大概率是
fnm env那行没写进当前 shell 对应的配置文件(bash 看.bashrc,zsh 看.zshrc),确认写对了重新开一个终端。 fnm use不带参数报 "Can't find version in dotfile":默认策略只查当前目录,按上文改成--version-file-strategy=recursive即可。fnm use 20提示版本不存在:该版本还没装,用fnm use 20 --install-if-missing一条命令装好再切。
相关资源
- 完整命令参考:docs/commands.md
- 全部配置开关说明:docs/configuration.md
- 用
--node-dist-mirror装 nightly 版本:docs/nightly.md - 延伸阅读:版本解析逻辑在 src/choose_version_for_user_input.rs,版本文件读取在 src/version_files.rs,各 shell 的适配实现在 src/shell/
把版本切换从"每次都要想一步"变成"cd 进去就发生",是 fnm 最核心的价值。现在只需做一件事:打开你的 shell 配置文件,把上面那一行eval写进去,重启终端,然后fnm install装一个你手头的版本试试。
【免费下载链接】fnm🚀 Fast and simple Node.js version manager, built in Rust项目地址: https://gitcode.com/gh_mirrors/fn/fnm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考