介绍
fnm(Fast Node Manager)是一款用 Rust 编写的 Node.js 版本管理工具,核心定位是轻量、极速、跨平台地管理同一台机器上的多个 Node.js 版本。
解决问题
Node.js 项目经常会出现“老项目要低版本,新项目要高版本”的情况。fnm 的作用就是让不同项目可以各自锁定需要的 Node 版本,避免手动卸载、重装、改环境变量带来的混乱。
它和 nvm 属于同类工具,但实现方式不同:nvm 主要是 Shell 脚本方案,fnm 则是编译后的原生二进制程序,所以启动和切换速度通常更快。
技术特点
- Rust 编写,性能较高:fnm 以单二进制文件形式运行,没有额外的运行时依赖,启动和版本切换通常在毫秒级完成。
- 跨平台一致:同时支持 Windows、macOS、Linux 和 WSL 环境,同一套命令在不同系统上行为基本一致。
- 零依赖、轻量部署:安装包体积小,通常只有几 MB,不需要额外依赖复杂环境。
- 版本隔离清晰:每个 Node.js 版本都有独立目录,切换时通过环境变量和链接机制指向对应版本,避免版本互相污染。
- Shell 适配较全:支持 Bash、Zsh、Fish、PowerShell、Windows CMD 等常见终端环境。
版本管理能力
fnm 支持完整的 Node.js 版本生命周期管理:
- 安装指定版本:可以安装精确版本号,例如某个具体的 Node 18、20、22 版本。
- 安装 LTS / 最新版本:支持直接安装最新 LTS 或最新 Current 版本。
- 语义化版本匹配:支持按 SemVer 规则匹配版本,例如按主版本或范围选择。
- 版本切换:可以在当前会话中切换到指定版本。
- 默认版本设置:可以设置一个全局默认 Node 版本。
- 别名管理:可以给某个版本设置自定义别名,方便记忆和使用。
- 卸载版本:可以移除不再需要的 Node 版本。
- 查看已安装版本:可以列出本地已经安装的 Node 版本。
自动版本识别
fnm 比较方便的一点是能够根据项目文件自动识别所需版本:
- 支持
.nvmrc文件; - 支持
.node-version文件; - 部分场景下也可读取
package.json中engines.node字段。
配合自动切换机制,进入项目目录时可以自动匹配对应 Node 版本,减少手动切换操作。
与 nvm 的主要区别
| 维度 | fnm | nvm |
|---|---|---|
| 实现方式 | Rust 二进制程序 | Shell 脚本 |
| 速度 | 启动和切换更快 | 相对较慢 |
| 跨平台 | Windows/macOS/Linux 统一 | Windows 需使用 nvm-windows |
| 自动切换 | 原生支持项目版本文件 | 通常需要额外配置 |
| 版本文件 | .nvmrc、.node-version、engines.node |
主要是 .nvmrc |
| 依赖 | 单文件,零依赖 | 依赖 Shell 环境 |
适用场景
- 多项目并行开发:不同项目依赖不同 Node 版本时,fnm 可以快速切换环境。
- 团队协作:通过
.nvmrc或.node-version统一团队 Node 版本,减少“我本地能跑”的问题。 - CI/CD 流水线:适合需要快速安装和切换 Node 版本的自动化构建场景。
- Monorepo / 微服务开发:多个子项目可能使用不同 Node 版本时,fnm 能降低环境管理成本。
- 跨平台开发:在 Windows、macOS、Linux 之间切换开发环境时,命令体验更一致。
局限性
fnm 并不是所有场景都优于其他工具。它的生态成熟度、社区历史积累不如 nvm;部分高级用法、插件生态也可能没有 nvm 丰富。如果团队已经长期稳定使用 nvm,并且没有明显性能或跨平台痛点,未必一定要迁移。
总体来看,fnm 更适合希望获得更快版本切换速度、统一跨平台体验、并且偏好轻量二进制工具的开发环境。