fnm VS brew 哪个更适合用来进行node版本管理
先给核心结论
单纯用来管理多个 Node.js 版本:选 fnm,不要用 Homebrew 直接管理 node。
Homebrew 是系统包管理器,天生不适合做多版本 Node 切换;fnm 是专门为 Node 版本切换设计的工具。
一、先分清二者定位(最关键)
1. Homebrew(brew)
brew = macOS/Linux 系统软件包管理器
- 可以安装
node、node@18、node@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 现代化高速替代品)
✅ 优势:
- 同时保存任意数量 Node 版本,一条命令切换:
fnm use 18 - 原生支持
.nvmrc/.node-version,进入项目文件夹自动切换对应 Node(开发刚需) - 启动、切换速度远快于 bash 写的 nvm
- 跨平台:macOS / Linux / Windows 通用
- 版本完全隔离,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 | |
原则:系统不要同时存在 brew-node + fnm-node,极易PATH冲突
⚠️ 方案B(仅极少数场景)
只用 brew node,仅限你永远只需要一个固定 Node 版本
适合:服务器、简单脚本、工具依赖,不会同时维护多个前端项目。
只要你需要同时维护2个以上项目,立刻放弃这种方案。
四、常见误区澄清
❌误区:
brew 可以装 node@18 node@20,足够用
真实情况:只能手动硬改PATH切换,没有自动切换,团队项目.nvmrc完全无法利用,效率极低。❌误区:fnm 和 brew node 可以混用
强烈不建议。很容易出现which node一会指向 brew、一会指向 fnm,疑难bug排查半天。
五、最终选择建议
- 日常前端/全栈开发、经常切换项目、不同项目要求不同Node版本 → fnm(首选)
- 机器仅运行固定脚本,永远只使用单一Node版本,不做多项目开发 → brew node 够用
补充:简单 fnm 常用命令参考
1 | |
fnm VS brew 哪个更适合用来进行node版本管理
https://blog.carlvictor.cn/posts/7c6f499b.html