在多个项目并行开发的情况下,只安装一个 Node.js 版本基本是不够用的。NVM 的作用不只是“切换版本方便”,而是把 Node 环境从“系统依赖”变成“项目可切换资源”,在开发过程中效率会大大提升。


一、为什么需要 NVM

比如我当前使用的是 Node 22 版本,在运行一些旧项目时,会直接报错:

Error: error:0308010C:digital envelope routines::unsupported

这个问题本质上是 Node.js 与 OpenSSL 版本不兼容导致的。较新的 Node 版本升级到了 OpenSSL 3.0,而该版本默认禁用了部分旧的加密算法,导致一些依赖旧实现的项目无法正常运行。

如果电脑里只安装一个 Node 版本,这种场景下就会非常被动:要么反复重装 Node,要么修改环境变量,过程繁琐且容易出错。

后来我基本固定了一种方式:在开始任何项目之前,先把 NVM 环境准备好。这样每个项目需要什么版本,直接切换即可,不需要再对系统环境做额外干预,整个开发过程会稳定很多。


二、NVM 和 n 的区别

Node 版本管理工具里,常见的主要是 n 和 NVM。

简单来说,n 更适合 macOS / Linux,而 Windows 环境下通常使用 nvm-windows。两者思路类似,但实现方式不同,所以在 Windows 上直接用 NVM 会更省事一些。


三、NVM 下载与安装

Windows 下可以直接下载安装包,安装过程本身不复杂,但有一个点我比较建议注意:目录尽量一开始就规划好。

我自己一般会这样设置:

NVM 安装目录:D:\env\nvm
Node 软链接目录:D:\env\nvm\nodejs

安装时直接指定这两个路径,后面管理起来会清晰很多。

安装完成后,可以打开命令行验证:

nvm -v

能看到版本号,就说明安装成功。


四、基础配置(settings.txt)

安装完成后,建议看一下 NVM 目录下的 settings.txt,这里可以顺手做一些优化配置:

root: D:\env\nvm
path: D:\env\nvm\nodejs
node_mirror: https://npmmirror.com/mirrors/node/
npm_mirror: https://npmmirror.com/mirrors/npm/

这里我通常会改两个点:一个是路径统一放在 D 盘,方便管理;另一个是使用国内镜像,加快下载速度。


五、环境变量

大多数情况下,安装程序会自动帮你配置好环境变量。如果需要手动确认,可以看一下是否包含:

NVM_HOME = D:\env\nvm
NVM_SYMLINK = D:\env\nvm\nodejs

以及 Path 中是否包含对应路径。

这一块我自己的经验是:如果不是特殊情况,不要随意手动改动,默认配置往往更稳定。


六、日常使用方式

NVM 的使用其实非常简单,我平时用得最多的也就几个命令。

安装指定版本:

nvm install 16
nvm install 20

查看已安装版本:

nvm ls

切换版本:

nvm use 16

查看当前版本:

node -v

基本上就是:哪个项目需要哪个版本,切过去就行,几秒钟解决问题。


七、配合 pnpm 的一个小优化

如果在用 pnpm,我一般会顺手把缓存目录也调整一下,避免默认占用 C 盘:

pnpm config set store-dir D:\env\nvm\store

这样 Node、NVM、pnpm 的相关文件都在一个目录下,后续清理或迁移都比较方便。


八、VSCode 常见问题

在 Windows 上,有时会遇到在 VSCode 里执行 npm run dev 报权限错误的情况。

我一般有两个处理方式。

一种是直接用管理员身份启动 VSCode;另一种是调整 PowerShell 执行策略:

Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned

大多数情况下,这两种方式都可以解决问题。


总结

我踩过一个很典型的坑:手动改了 Node 目录和 settings.txt,结果 nvm use 显示成功,node -v 却没变。

本质原因是两个路径不一致,软链接没生效。

解决很简单:删掉手动配置,按默认流程重装,让 NVM 自己管理路径。

至于我是怎么知道的……别问,问就是实践出真知🙂。