文章目录
一、NVM:让 Node 版本切换像换衣服一样简单
1.1 为什么需要 NVM?
Node.js 的版本迭代速度极快,从早期的 v0.x 到现在的 v20+,API 变化(比如 ES 模块支持、内置模块新增)可能直接导致项目报错。更麻烦的是,不同项目可能绑定不同的 Node 版本(比如老项目依赖 Node 14 的某些特性,新项目要用 Node 18 的性能优化)。
没有 NVM 时,你可能需要:
-
手动卸载当前 Node
-
去官网下载指定版本安装包
-
反复配置环境变量
而有了 NVM,这一切都能通过终端命令搞定,甚至能同时保留多个版本,随用随切。
1.2 安装 NVM 的正确姿势(跨系统细节)
NVM 有两个主流版本:Linux/macOS 用户用nvm-sh/nvm,Windows 用户用coreybutler/nvm-windows。
▶ Windows 安装步骤
-
先卸载电脑上已有的 Node.js(包括全局 npm 包),避免冲突
-
访问Release 页面,下载
nvm-setup.exe -
双击安装,建议路径:
D:\nvm(NVM 根目录)和D:\nodejs(Node 快捷方式目录),路径不能有空格、中文或特殊字符 -
验证:重启终端(必须!),输入
nvm version,显示版本号即成功
▶ Linux/macOS 安装步骤
-
卸载现有 Node(若有):
sudo rm -rf /usr/local/bin/node /usr/local/bin/npm -
通过 curl 或 wget 安装 nvm-sh/nvm:
# curl方式 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # wget方式 wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash -
配置环境变量(关键步骤):
安装脚本会自动往
~/.bashrc、~/.zshrc或~/.profile中添加配置,若未生效,手动添加:export NVM_DIR="$([ -z "${XDG_CONFIG_HOME}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" -
生效配置:
source ~/.bashrc(或对应 shell 的配置文件) -
验证:
nvm --version显示版本号即成功
1.3 必备命令:NVM 操作手册(含团队协作技巧)
| 命令 | 作用 | 实战场景 |
|---|---|---|
nvm list available | 查看可安装的 Node 版本 | 想知道最新 LTS 版本时,用它看列表(LTS 是长期支持版,适合生产环境) |
nvm list(或nvm ls) | 查看已安装版本 | 列表中带*的是当前正在使用的版本 |
nvm install 18.18.0 | 安装指定版本 | 项目 README 要求 Node 18,直接装这个版本 |
nvm install latest | 安装最新版 | 测试新项目兼容性时用 |
nvm install lts | 安装最新 LTS 版 | 生产环境优先选 LTS,稳定性有保障 |
nvm use 16.20.2 | 切换到指定版本 | 从 Node 18 项目切到 Node 16 项目时执行 |
nvm uninstall 14.21.3 | 卸载指定版本 | 清理不再使用的旧版本,节省空间 |
nvm on/nvm off | 启用 / 禁用 NVM | 临时用系统自带 Node 时可禁用 |
▶ 团队协作神器:.nvmrc 文件
多人协作时,没必要让每个人记住项目依赖的 Node 版本。只需在项目根目录创建.nvmrc文件,写入版本号(如18.18.0),团队成员执行nvm use即可自动切换到对应版本(若未安装,会提示N/A,此时执行nvm install即可安装文件中指定的版本)。
示例:
# 项目根目录创建文件
echo "18.18.0" > .nvmrc
# 切换版本(全团队通用)
nvm use # 自动读取.nvmrc中的版本
▶ 避坑:NVM 安装 Node 失败?
-
Windows:打开
nvm安装目录/settings.txt,添加国内镜像(解决官网访问慢):node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ -
Linux/macOS:若报
Permission denied,绝对不要用 sudo(nvm 默认安装在用户目录,sudo 会导致权限错乱),修复命令:sudo chown -R $USER ~/.nvm # 重置nvm目录权限
二、NRM:让包管理工具 “跑” 得更快(含替代方案)
2.1 为什么需要 NRM?
npm 默认的镜像源(https://registry.npmjs.org/)在国内访问速度感人,经常出现ETIMEDOUT错误。而 NRM(Node Registry Manager)可以帮你:
-
快速切换镜像源(比如淘宝源、npm 官方源、cnpm 源)
-
测试不同源的访问速度
-
管理自定义源(比如公司内部私有源)
2.2 安装 NRM
NRM 是 npm 包,需要先有 Node 环境(用 NVM 装一个即可),安装命令:
npm install -g nrm
注意:
-
Windows 用户若报
EACCES错误,用管理员终端安装 -
Linux/macOS 用户无需 sudo(nvm 管理的 Node 全局包路径在用户目录)
2.3 必备命令:NRM 操作手册
| 命令 | 作用 | 实战场景 |
|---|---|---|
nrm ls | 查看所有可用源 | 列表中带*的是当前使用的源 |
nrm use taobao | 切换到淘宝源 | npm 安装慢时,切淘宝源(https://registry.npmmirror.com/) |
nrm use npm | 切换到官方源 | 某些包只有官方源有的时候用 |
nrm test | 测试所有源的响应速度 | 想知道哪个源最快时,执行后看毫秒数 |
nrm add myreg http://xxx.registry | 添加自定义源 | 公司有私有源时,用这个命令添加 |
nrm del myreg | 删除自定义源 | 不再需要的源可以删掉 |
2.4 不想用 NRM?这些替代方案更轻量
如果觉得 NRM 依赖 npm 全局安装,或偶尔有 bug(比如源列表更新不及时),可以用这些原生方案:
▶ 直接用包管理工具自带命令
# npm/pnpm/yarn 切换源(全局生效)
npm config set registry https://registry.npmmirror.com/
pnpm config set registry https://registry.npmmirror.com/
yarn config set registry https://registry.npmmirror.com/
# 查看当前源
npm config get registry
pnpm config get registry
yarn config get registry
▶ 专用工具
-
yrm:专为 yarn 设计的源管理器,用法和 nrm 一致(
npm install -g yrm) -
pnpm 原生支持:pnpm 7 + 可直接用
pnpm registry use <源名>(需先配置源:pnpm registry add taobao ``https://registry.npmmirror.com/)
三、与包管理工具的兼容:NVM+NRM 如何适配 npm/pnpm/yarn/cnpm
Node 生态里的包管理工具不止 npm,还有 pnpm(快速)、yarn(经典)、cnpm(淘宝定制)。NVM 和 NRM 与它们的配合,核心是 “版本隔离” 和 “源统一”。
3.1 与 npm 的兼容(最核心)
npm 是 Node 自带的包管理工具,NVM 切换 Node 版本时,npm 版本会自动跟着变(比如 Node 18.18.0 配套 npm 9.8.1,Node 20.9.0 配套 npm 10.1.0)。
注意点:
-
全局安装的 npm 包(比如
npm install -g vue-cli)会存放在当前 Node 版本的目录下(nvm安装目录/v18.18.0/node_modules),切换版本后需要重新安装(这是好事,避免版本冲突) -
NRM 切换的源对 npm 完全生效,
nrm use taobao后,npm install会自动走淘宝源
3.2 与 pnpm 的兼容(速度王者)
pnpm 是替代 npm 的高效包管理工具,需要手动安装,且与 Node 版本绑定:
-
用 NVM 切换到目标 Node 版本(比如 18.18.0)
-
安装 pnpm:
npm install -g pnpm(此时 pnpm 会被安装到当前 Node 版本的全局目录) -
切换 Node 版本后,若 pnpm 不可用,重新执行
npm install -g pnpm即可
NRM 适配:pnpm 默认使用 npm 的源配置,所以nrm use taobao后,pnpm install也会走淘宝源。如果想单独配置 pnpm 的源,可以用pnpm config set registry <源地址>。
3.3 与 yarn 的兼容(经典选择)
yarn 有两个版本:经典版(yarn 1.x)和现代版(yarn 2+,基于 Berry)。
-
经典版:和 pnpm 类似,
npm install -g yarn安装,切换 Node 版本后需重新安装,NRM 的源对其生效 -
现代版:通过
corepack管理(Node 16.13 + 内置),步骤:
-
启用 corepack:
corepack enable -
安装 yarn:
corepack prepare yarn@stable --activate -
切换 Node 版本后,重新执行
corepack prepare即可
NRM 适配:经典版 yarn 会读取 npm 的源配置,现代版 yarn 需单独设置(yarn config set registry <源地址>)。
3.4 与 cnpm 的兼容(淘宝定制)
cnpm 是淘宝推出的 npm 镜像工具,专为国内环境优化:
-
用 NVM 切换 Node 版本后,安装 cnpm:
npm install -g cnpm --registry=https://registry.npmmirror.com -
切换 Node 版本后,需重新安装 cnpm(和 pnpm 逻辑一致)
NRM 适配:cnpm 默认走淘宝源,无需额外配置。如果想切换,可用cnpm config set registry <源地址>。
3.5 进阶:锁定包管理工具版本(团队协作必备)
即使 Node 版本一致,包管理工具版本不同也可能导致依赖安装差异(比如 pnpm 8 和 pnpm 9 的锁文件格式不同)。解决方案:在package.json中用packageManager字段锁定版本,配合 corepack 自动生效。
示例:
{
"packageManager": "pnpm@9.0.0" // 锁定pnpm版本为9.0.0
}
配置后,团队成员执行corepack install会自动安装指定版本的 pnpm,无需手动管理。
加餐:全局包与项目依赖,别再搞混了!
很多开发者刚接触包管理工具时,会困惑:npm install -g xxx和npm install xxx到底有啥区别?为什么切换 Node 版本后,有些命令能用,有些却提示 “找不到”?
其实核心在于 “全局包” 和 “项目依赖” 的定位完全不同,我们用一张表讲清楚:
| 维度 | 全局包(Global Packages) | 项目依赖(Project Dependencies) |
|---|---|---|
| 安装命令 | 带-g参数:npm install -g pnpm | 不带-g参数:npm install react |
| 安装位置 | 存放在当前 Node 版本的专属目录(受 NVM 管理):- Windows:D:\nvm\v18.18.0\node_modules- Linux/macOS:~/.nvm/versions/node/v18.18.0/lib/node_modules | 存放在项目根目录的node_modules中,与项目强绑定 |
| 作用 | 提供 “命令行工具”,供全局调用(不直接参与项目代码运行):- 脚手架(vue-cli、create-react-app)- 包管理工具(pnpm、yarn)- 开发辅助工具(eslint、prettier全局版) | 项目运行 / 开发必需的 “代码依赖”,会被项目代码直接引入:- 框架库(react、vue)- 工具库(lodash、axios)- 开发依赖(webpack、babel,通过--save-dev安装) |
| 版本管理 | 全局唯一版本,切换 Node 版本后需重新安装(NVM 版本隔离特性) | 每个项目独立版本,通过package.json和锁文件(package-lock.json/pnpm-lock.yaml)精确控制,团队成员安装后版本一致 |
| 与 NVM 的关系 | 完全受 NVM 版本隔离影响:切换 Node 版本后,全局包会 “消失”(因存放目录变了),需重新安装对应版本的全局包 | 不受 NVM 版本隔离影响(存放在项目目录),但需注意 “Node 版本兼容性”(比如旧项目依赖的webpack@4可能不支持 Node 20+) |
举个例子,瞬间明白
-
你安装
npm install -g vue-cli(全局包),是为了在命令行直接用vue create my-project创建项目,这个工具本身不参与项目运行,只是帮你初始化代码。当你用 NVM 切换到另一个 Node 版本,这个命令会失效,因为vue-cli存放在上一个 Node 版本的目录里,此时需要重新执行npm install -g vue-cli。 -
你在项目里安装
npm install vue(项目依赖),是为了在代码中写import Vue from 'vue',这个包会被打包到项目里,直接影响运行。即使你用 NVM 切换 Node 版本,只要项目目录下的node_modules还在,vue就可以正常被引入(前提是 Node 版本兼容vue的运行要求)。
新手避坑:什么时候用全局包?什么时候用项目依赖?
-
用全局包:工具类软件,且需要在任意目录通过命令行调用(如
pnpm、http-server)。尽量少装全局包,避免版本冲突(比如 A 项目需要eslint@7,B 项目需要eslint@8,全局安装会冲突,此时更适合装在项目依赖中,通过npx eslint调用)。 -
用项目依赖:所有直接参与项目代码运行或构建的包(如
react、webpack),必须装在项目里,并用package.json记录,确保团队协作时版本一致。
四、实战:从 0 到 1 搭建多版本开发环境
假设你需要同时开发两个项目:
-
项目 A:老系统,依赖 Node 16 + npm 8
-
项目 B:新项目,依赖 Node 20 + pnpm 9,且需要用公司私有源
操作步骤:
-
安装 NVM 并验证:
nvm version # 显示版本号即成功 -
安装所需 Node 版本:
nvm install 16.20.2 # 项目A用 nvm install 20.9.0 # 项目B用 nvm list # 查看已安装版本,确认两个版本都在列 -
配置项目 A 环境:
nvm use 16.20.2 # 切换到16版本 node -v # 确认显示v16.20.2 npm -v # 确认显示8.x.x(16版本配套npm) # 项目根目录创建.nvmrc,方便团队协作 echo "16.20.2" > .nvmrc -
配置项目 B 环境:
nvm use 20.9.0 # 切换到20版本 node -v # 确认显示v20.9.0 npm install -g pnpm # 安装pnpm(全局包,随Node版本隔离) pnpm -v # 确认安装成功 # 锁定pnpm版本 echo '{"packageManager": "pnpm@9.0.0"}' > package.json corepack install # 应用版本锁定 # 添加公司私有源 nrm add company http://registry.company.com nrm use company # 切换到私有源 pnpm install # 用pnpm安装项目依赖(存放在项目node_modules)
五、避坑指南:这些问题 90% 的人都会遇到
-
切换 Node 版本后,全局包找不到
原因:全局包存放在对应 Node 版本的目录下,切换版本后自然找不到。
解决:在新切换的版本下重新全局安装即可(这是设计初衷,避免版本冲突)。
-
NVM 安装 Node 时报错 "Could not retrievehttps://nodejs.org/dist/"
原因:网络问题,无法访问 Node 官网。
解决:配置 NVM 的镜像源(Windows 改
settings.txt,Linux/macOS 执行export NVM_NODEJS_ORG_MIRROR=``https://npmmirror.com/mirrors/node)。 -
NRM 切换源后,npm install 仍很慢
原因:可能是缓存或源配置冲突。
解决:清除 npm 缓存
npm cache clean -f,再用npm config get registry确认源是否正确。 -
Windows 终端提示 “nvm 不是内部或外部命令”
原因:环境变量未自动配置。
解决:手动添加 NVM 安装目录到系统环境变量
Path中(比如D:\nvm)。 -
Linux/macOS 用 nvm 后,node 命令偶尔失效
原因:终端启动时未加载 nvm 配置。
解决:在
~/.bashrc或~/.zshrc末尾添加source ~/.nvm/``nvm.sh,重启终端即可。
结语:工具是为了解放生产力
开发之路,工具先行,祝你少踩坑,多产出!

424

被折叠的 条评论
为什么被折叠?



