fnm VS brew 哪个更适合用来进行node版本管理

先给核心结论

单纯用来管理多个 Node.js 版本:选 fnm,不要用 Homebrew 直接管理 node。
Homebrew 是系统包管理器,天生不适合做多版本 Node 切换;fnm 是专门为 Node 版本切换设计的工具。

一、先分清二者定位(最关键)

1. Homebrew(brew)

brew = macOS/Linux 系统软件包管理器

  • 可以安装 nodenode@18node@20
  • 硬伤:无法同时激活多个版本,切换极其麻烦
  • 切换方式:手动改 PATH、来回安装卸载、容易产生冲突
  • brew update 会强制升级软件,一不小心 Node 被偷偷更新,老项目直接炸
  • 不支持项目目录自动切换 Node 版本.nvmrc / .node-version

常见坑:同时装 node@18 / node@20,需要手动写 export PATH="/opt/homebrew/opt/node@20/bin:$PATH" 来回切换;一旦环境变量写错,版本错乱。

2. fnm(Fast Node Manager)

fnm = 专门的 Node.js 多版本管理器(Rust 编写,nvm 现代化高速替代品)
✅ 优势:

  1. 同时保存任意数量 Node 版本,一条命令切换:fnm use 18
  2. 原生支持 .nvmrc / .node-version,进入项目文件夹自动切换对应 Node(开发刚需)
  3. 启动、切换速度远快于 bash 写的 nvm
  4. 跨平台:macOS / Linux / Windows 通用
  5. 版本完全隔离,npm/pnpm 全局包互不干扰

二、详细对比表

能力 brew 安装node fnm
多版本共存 ✅可以安装,但不能一键切换 ✅原生支持,一键切换
项目自动切换(.nvmrc) ❌不支持 ✅原生支持 --use-on-cd
精确安装任意小版本 ⚠️brew 旧版本经常缺失、很难锁定精确版本 ✅官方源所有 node 版本随便装
全局包隔离 ❌多个 node@xx 全局包容易混乱 ✅每个node版本独立npm全局环境
升级风险 ❌brew update 被动升级node ✅不会自动更新已安装Node
适用场景 系统工具依赖固定单个node 日常前端/全栈开发,多项目多Node版本

三、两种正确搭配方案(推荐实践)

✅ 方案A(绝大多数开发者推荐)

brew 只用来安装 fnm,Node 全部交给 fnm 管理

1
2
3
4
5
6
7
8
# 1. brew 安装 fnm
brew install fnm

# 2. shell 配置(~/.zshrc)
eval "$(fnm env --use-on-cd)"

# 3. 卸载 brew 上所有 node,避免冲突
brew remove node node@16 node@18 node@20

原则:系统不要同时存在 brew-node + fnm-node,极易PATH冲突

⚠️ 方案B(仅极少数场景)

只用 brew node,仅限你永远只需要一个固定 Node 版本
适合:服务器、简单脚本、工具依赖,不会同时维护多个前端项目。

只要你需要同时维护2个以上项目,立刻放弃这种方案。

四、常见误区澄清

  1. ❌误区:brew 可以装 node@18 node@20,足够用
    真实情况:只能手动硬改PATH切换,没有自动切换,团队项目.nvmrc完全无法利用,效率极低。

  2. ❌误区:fnm 和 brew node 可以混用
    强烈不建议。很容易出现 which node 一会指向 brew、一会指向 fnm,疑难bug排查半天。

五、最终选择建议

  1. 日常前端/全栈开发、经常切换项目、不同项目要求不同Node版本 → fnm(首选)
  2. 机器仅运行固定脚本,永远只使用单一Node版本,不做多项目开发 → brew node 够用

补充:简单 fnm 常用命令参考

1
2
3
4
5
fnm install --lts       # 安装最新LTS
fnm install 20.12.2 # 指定精确版本
fnm use 20 # 临时切换
fnm default 20 # 设置默认版本
fnm list # 查看已安装版本

fnm VS brew 哪个更适合用来进行node版本管理
https://blog.carlvictor.cn/posts/7c6f499b.html
作者
Carl Victor
发布于
2026年7月29日
许可协议