nvm 与 nrm


一、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/nvmWindows 用户coreybutler/nvm-windows

▶ Windows 安装步骤

  1. 先卸载电脑上已有的 Node.js(包括全局 npm 包),避免冲突

  2. 访问Release 页面,下载nvm-setup.exe

  3. 双击安装,建议路径:D:\nvm(NVM 根目录)和D:\nodejs(Node 快捷方式目录),路径不能有空格、中文或特殊字符

  4. 验证:重启终端(必须!),输入nvm version,显示版本号即成功

▶ Linux/macOS 安装步骤

  1. 卸载现有 Node(若有):sudo rm -rf /usr/local/bin/node /usr/local/bin/npm

  2. 通过 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
    
  3. 配置环境变量(关键步骤):

    安装脚本会自动往~/.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"
    
  4. 生效配置:source ~/.bashrc(或对应 shell 的配置文件)

  5. 验证: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 版本绑定:

  1. 用 NVM 切换到目标 Node 版本(比如 18.18.0)

  2. 安装 pnpm:npm install -g pnpm(此时 pnpm 会被安装到当前 Node 版本的全局目录)

  3. 切换 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 + 内置),步骤:

  1. 启用 corepack:corepack enable

  2. 安装 yarn:corepack prepare yarn@stable --activate

  3. 切换 Node 版本后,重新执行corepack prepare即可

NRM 适配:经典版 yarn 会读取 npm 的源配置,现代版 yarn 需单独设置(yarn config set registry <源地址>)。

3.4 与 cnpm 的兼容(淘宝定制)

cnpm 是淘宝推出的 npm 镜像工具,专为国内环境优化:

  1. 用 NVM 切换 Node 版本后,安装 cnpm:

    npm install -g cnpm --registry=https://registry.npmmirror.com
    
  2. 切换 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 xxxnpm 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-clicreate-react-app)- 包管理工具(pnpmyarn)- 开发辅助工具(eslintprettier全局版)项目运行 / 开发必需的 “代码依赖”,会被项目代码直接引入:- 框架库(reactvue)- 工具库(lodashaxios)- 开发依赖(webpackbabel,通过--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的运行要求)。

新手避坑:什么时候用全局包?什么时候用项目依赖?

  • 用全局包:工具类软件,且需要在任意目录通过命令行调用(如pnpmhttp-server)。尽量少装全局包,避免版本冲突(比如 A 项目需要eslint@7,B 项目需要eslint@8,全局安装会冲突,此时更适合装在项目依赖中,通过npx eslint调用)。

  • 用项目依赖:所有直接参与项目代码运行或构建的包(如reactwebpack),必须装在项目里,并用package.json记录,确保团队协作时版本一致。

四、实战:从 0 到 1 搭建多版本开发环境

假设你需要同时开发两个项目:

  • 项目 A:老系统,依赖 Node 16 + npm 8

  • 项目 B:新项目,依赖 Node 20 + pnpm 9,且需要用公司私有源

操作步骤

  1. 安装 NVM 并验证:

    nvm version  # 显示版本号即成功
    
  2. 安装所需 Node 版本:

    nvm install 16.20.2  # 项目A用
    
    nvm install 20.9.0   # 项目B用
    
    nvm list  # 查看已安装版本,确认两个版本都在列
    
  3. 配置项目 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
    
  4. 配置项目 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% 的人都会遇到

  1. 切换 Node 版本后,全局包找不到

    原因:全局包存放在对应 Node 版本的目录下,切换版本后自然找不到。

    解决:在新切换的版本下重新全局安装即可(这是设计初衷,避免版本冲突)。

  2. 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)。

  3. NRM 切换源后,npm install 仍很慢

    原因:可能是缓存或源配置冲突。

    解决:清除 npm 缓存npm cache clean -f,再用npm config get registry确认源是否正确。

  4. Windows 终端提示 “nvm 不是内部或外部命令”

    原因:环境变量未自动配置。

    解决:手动添加 NVM 安装目录到系统环境变量Path中(比如D:\nvm)。

  5. Linux/macOS 用 nvm 后,node 命令偶尔失效

    原因:终端启动时未加载 nvm 配置。

    解决:在~/.bashrc~/.zshrc末尾添加source ~/.nvm/``nvm.sh,重启终端即可。

结语:工具是为了解放生产力

开发之路,工具先行,祝你少踩坑,多产出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值