Rocky Linux 9 安装 Node.js 三种方案对比:dnf、NodeSource 与 nvm

1. 项目概述:为什么在 Rocky Linux 9 上装 Node.js 不是“点几下就完事”的事

Rocky Linux 9 是 CentOS 生态最主流的继任者,稳定、安全、企业级支持完善,但它的软件仓库哲学和 CentOS 8 一脉相承—— 极度克制 。它不追求最新,只追求经过充分验证的长期可用性。这就直接导致一个现实:官方仓库里自带的 nodejs 包,版本通常是 16.x 或 18.x ,而且一旦发布,整个生命周期内几乎不会升级主版本。而今天,前端工程早已普遍依赖 Node.js 20+ 的 ESM 原生支持、Web Crypto API、稳定的 fetch 全局对象;后端服务用 Express、Fastify 也默认要求 18.17+ 或 20.9+ 才能规避已知的 TLS 1.3 握手缺陷;就连你 npm create vite@latest 生成一个新项目,Vite 官方文档也明确写着 “Requires Node.js >= 20.0.0”。所以,当你在 Rocky Linux 9 上执行 dnf install nodejs ,装上的那个“能跑”的 Node.js,大概率是个 功能残缺、生态脱节、连 npm create 都会报错的半成品 。这不是你的操作问题,是发行版设计哲学和现代 JavaScript 生态节奏之间的一道真实鸿沟。

我第一次在 Rocky 9 上部署一个 Vue 3 + Pinia + Vite 的管理后台时就栽了跟头。 dnf install nodejs 装完, node -v 显示 v18.18.2 ,看起来很体面。但 npm create vite@latest 直接卡死在 Checking for latest version... ,等了五分钟没反应。 strace 一把抓下来,发现 npm 在反复尝试连接 registry.npmjs.org 的 IPv6 地址,而我们的生产环境防火墙策略默认禁用了 IPv6 outbound。这本身是个网络配置问题,但根源在于这个 v18.18.2 的 npm 版本太老(6.14.17),它没有现代 npm 那套智能的 fallback 机制,遇到 IPv6 失败就死等,不像 npm 9.x 会秒切 IPv4。后来我手动升级 npm 到 9.x,结果又报 ERR_UNSUPPORTED_ESM_URL_SCHEME ,因为老 Node 核心对 ESM 模块解析器的支持有硬伤。折腾了大半天,最后发现最省事的解法,不是修 npm,而是换 Node。这就是为什么标题里写的是 “How To Install Node.js”,而不是 “How To Install The Default Node.js”——我们要装的,是 真正能干活、能跟上生态节奏的那个 Node.js ,而不是系统仓库里那个“政治正确”的版本。

核心关键词 Node.js Rocky Linux 9 dnf nvm NodeSource ,每一个都指向一个关键决策点: dnf 是系统包管理器,代表“官方、稳定、但陈旧”; nvm 是用户级版本管理器,代表“灵活、最新、但需手动维护”; NodeSource 是第三方仓库,代表“折中、易用、社区信任”。选哪个?没有银弹。如果你是运维工程师,要给 50 台生产服务器批量部署一个固定版本的 Node.js 用于运行一个 Express API, NodeSource + dnf 是最稳妥的选择,一次安装,全网同步,审计日志清晰。如果你是前端开发者,本地开发机上要同时维护三个项目——一个用 Vue 2 + Webpack(需 Node 14),一个用 Next.js 14(需 Node 18.17+),一个用 Bun(需 Node 20+),那 nvm 就是你唯一的救星, nvm use 18 nvm use 20 切换起来比呼吸还自然。而 dnf 单独使用,只适合那种“我就想快速跑个 node --version 看看”的临时测试场景。这篇文章,就是帮你把这三座桥都铺平、踩实,让你在 Rocky Linux 9 这片土地上,无论什么角色、什么需求,都能稳稳当当地把 Node.js 装好、用好、管好。

2. 方案深度拆解:dnf、NodeSource 与 nvm 的底层逻辑与适用边界

2.1 dnf install nodejs:官方仓库的“安全区”与“舒适陷阱”

dnf install nodejs 是 Rocky Linux 9 用户最本能的操作。它快、它简单、它符合 Linux 传统哲学——一切来自可信源。但它的底层逻辑,决定了它是一把双刃剑。

首先, dnf 从哪里找包?答案是 appstream 仓库。你可以用 dnf repolist 看到它被列为 appstream 。这个仓库里的 nodejs 包,是由 Rocky Linux 的构建团队从上游 RHEL 的 appstream 同步而来。RHEL 的策略是:一个 major 版本(如 RHEL 9)的生命周期内, appstream 仓库只提供一个 LTS 版本的 Node.js,并且只做安全补丁(Security Patch)和关键错误修复(Critical Bug Fix), 绝不升级主版本号 。所以,Rocky Linux 9.0 发布时带的是 Node.js 16,9.2 升级到了 Node.js 18,而下一个主版本 Node.js 20,要等到 RHEL 9.4(预计 2024 年底)才会进入 appstream 。这意味着,你在 Rocky 9.2 上 dnf install nodejs ,得到的永远是 18.x ,哪怕 Node.js 26 已经发布了半年。

其次, dnf 安装的 Node.js 是 系统级全局安装 。它被放在 /usr/bin/node /usr/bin/npm ,所有用户、所有 shell 会话共享同一个二进制文件。这带来了两个硬伤:第一, 无法多版本共存 。你想同时用 Node 18 跑旧项目,用 Node 20 跑新项目? dnf 说“不行,你只能有一个”。第二, 权限与路径污染 npm install -g 安装的全局包(比如 pm2 create-react-app )会被放到 /usr/local/bin/ 下,这需要 sudo 权限。而一旦你用 sudo npm install -g ,npm 的缓存目录( ~/.npm )和全局模块目录( /usr/local/lib/node_modules )的所有权就可能混乱,导致后续非 root 用户执行 npm 命令时出现 EACCES: permission denied 错误。我见过太多新手因此放弃,转头去搜“npm global install permission denied”,最后陷入无尽的 chmod chown 循环。

所以, dnf install nodejs 的适用边界非常清晰: 仅适用于对 Node.js 版本无特殊要求、且只需要一个稳定版本用于运行单一、长期服务的生产环境 。比如,你用 Node.js 写了一个简单的 HTTP 服务,监听一个端口,返回一段 JSON,这个服务上线后三年都不会改代码。这种场景下, dnf 提供的 Node.js 18 就是黄金标准——它经过 Red Hat QA 团队数月的测试,与 glibc、openssl 等系统库的兼容性有绝对保障,任何 CVE 补丁都会随 dnf update 一键推送到你面前。但凡你的需求里带有一点“灵活性”、“多版本”、“最新特性”, dnf 就立刻从“安全区”滑入“舒适陷阱”。

2.2 NodeSource 仓库:在官方与前沿之间架起一座合规桥梁

NodeSource 是一个由 Node.js 社区资深成员创立的第三方仓库,其核心价值在于: 它为 RHEL/CentOS/Rocky 等 RPM 系统提供了与 Node.js 官方发布节奏完全同步的、经过严格签名的二进制包 。它不是黑客编译的野鸡包,而是 Node.js 官方认可的、面向企业用户的分发渠道。

NodeSource 的工作原理,本质上是对 dnf 的一次优雅增强。它不替换你的 dnf ,而是给你添加一个新的、受信的软件源。具体来说,它通过一个 setup_node.sh 脚本,完成三件事:第一,在 /etc/yum.repos.d/ 下创建一个名为 nodesource.repo 的文件,里面定义了 baseurl 指向 NodeSource 的 CDN;第二,导入 NodeSource 的 GPG 公钥,确保你从这个源下载的每一个 RPM 包,都是由 NodeSource 私钥签名的, dnf 在安装前会自动校验签名,杜绝中间人篡改;第三,它会根据你的系统版本(Rocky 9 对应 el9 ),自动选择正确的架构(x86_64, aarch64)和仓库分支( 18.x , 20.x , 22.x )。

这里有个关键细节常被忽略:NodeSource 仓库是 按主版本号分隔的 。你不能在一个系统上同时启用 18.x 20.x 两个仓库。 dnf 的设计原则是“一个包名,一个来源”,如果两个仓库都提供了 nodejs 包, dnf 会报错或随机选择一个。所以,NodeSource 的使用流程是:先决定你要哪个主版本(比如 20.x ),然后运行对应的 setup 脚本( curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - ),再执行 sudo dnf install -y nodejs 。这个过程, dnf 安装的 nodejs 包,其 rpm -qi nodejs 输出的 Vendor 字段会显示 NodeSource ,而不是 Rocky Linux ,这在企业审计时是一个重要的合规凭证。

NodeSource 的最大优势,是它完美继承了 dnf 的所有优点,同时规避了其最大的缺点——版本陈旧。它提供的 Node.js 20.x,就是官网 nodejs.org 上下载的 .tar.xz 包里那个二进制文件,只是被打包成了 RPM。这意味着,你 node -v 看到的版本号,和官网 Release Notes 里写的完全一致,所有新特性、所有 bug fix 都原汁原味。更重要的是,它依然是 系统级安装 node npm 命令在所有 shell 中全局可用, npm install -g 的路径也是 /usr/local/bin/ ,和 dnf 原生安装的行为完全一致。对于 DevOps 工程师来说,这意味着你可以用 Ansible 的 dnf 模块,像管理 httpd nginx 一样,精准地控制 1000 台服务器上的 Node.js 版本:“确保所有 web-server 组的机器,Node.js 版本 >= 20.12.0”。这种可编程、可审计、可回滚的确定性,是 nvm 永远无法提供的。

2.3 nvm(Node Version Manager):开发者私域的终极自由

如果说 dnf NodeSource 是为“系统”和“团队”设计的方案,那么 nvm 就是彻头彻尾为“个人开发者”量身定制的工具。它的名字已经揭示了一切: Node Version Manager 。它不是一个安装程序,而是一个 shell 函数集合 ,其核心思想是: 把 Node.js 的不同版本,当作普通文件,存放在你自己的家目录下,然后通过修改 $PATH 环境变量,动态地让 shell 找到你想要的那个 node 二进制文件

nvm 的安装方式就暴露了它的哲学。你不是用 dnf apt 去装它,而是用 curl wget ,从 GitHub 上把一个 install.sh 脚本拉下来,然后 bash install.sh 。这个脚本干了什么?它把 nvm 的所有代码(主要是 nvm.sh 这个 shell 脚本)复制到 ~/.nvm/ 目录下,并在你的 ~/.bashrc (或 ~/.zshrc )里追加几行代码,其中最关键的一行是 export NVM_DIR="$HOME/.nvm" source "$NVM_DIR/nvm.sh" 。这意味着, nvm 的生命完全绑定在你的用户账户上,root 用户根本看不到它,其他用户也互相隔离。 nvm install 20.12.0 下载的 Node.js 二进制文件,就安静地躺在 ~/.nvm/versions/node/v20.12.0/ 里, node 命令只是一个指向这里的符号链接。

nvm 的威力,体现在它对“版本切换”这件事的极致简化上。 nvm use 20.12.0 这条命令,背后发生的是: nvm 修改了当前 shell 会话的 $PATH ,把 ~/.nvm/versions/node/v20.12.0/bin 放在了最前面。于是,当你敲 node ,shell 就会优先找到这个路径下的 node ,而不是 /usr/bin/node 。更绝的是 nvm alias default 20.12.0 ,它会创建一个 default 别名,每次你新开一个终端, nvm 都会自动 use 这个别名对应的版本。而 nvm use --delete-prefix v20 这种带 --delete-prefix 的命令,则能让你在项目根目录下创建一个 .nvmrc 文件,里面只写 20.12.0 ,然后只要 cd 进入这个目录, nvm 就会自动切换过去。这种基于目录的、自动化的、无感的版本管理,是 dnf NodeSource 想都不敢想的体验。

但自由是有代价的。 nvm 的最大软肋,是它的 非系统性 。它不参与系统的包管理, dnf list installed | grep node 永远找不到它。这意味着,如果你用 nvm 安装了 Node.js,然后写了一个 systemd 服务文件来启动你的 Node 应用,这个服务文件里写的 ExecStart=/usr/bin/node app.js 是绝对失败的,因为 systemd 启动的服务,其环境变量里根本没有 nvm 设置的 $PATH 。你必须显式地写成 ExecStart=/home/youruser/.nvm/versions/node/v20.12.0/bin/node app.js ,这不仅难看,而且一旦你 nvm install 了新版本,这个路径就得手动改。所以, nvm 的黄金法则就是: 它只属于你的开发终端,不属于你的生产服务器 。把它用在 CI/CD 的 runner 上?可以,但你要确保 runner 的每个 job 都 source ~/.nvm/nvm.sh ;把它用在 Docker 构建里?可以,但你要在 Dockerfile 里完整复现 nvm 的安装和 nvm use 流程,这会让镜像层变厚、构建时间变长。 nvm 是一把锋利的瑞士军刀,但它不是基建的钢筋水泥。

3. 实操全流程:从零开始,三种方案逐一手把手落地

3.1 方案一:dnf install nodejs(最简模式,适合快速验证)

这是所有方案里步骤最少、耗时最短的,但请务必带着“这只是个起点”的心态来操作。

第一步:确认系统状态与基础更新

在 Rocky Linux 9 上,任何安装操作前,都应该先确保系统是最新的。这不是为了“装最新 Node”,而是为了确保 dnf 的元数据、GPG 密钥、以及底层的 glibc openssl 等关键库都是最新的,避免因系统组件过旧而导致 Node.js 运行时出现难以排查的 segfault(段错误)。打开终端,执行:

sudo dnf update -y

这个命令会下载并安装所有可用的系统更新。根据你的网络和系统初始状态,它可能需要几分钟。完成后,建议重启一下,以确保所有内核模块和系统服务都加载了新版本。虽然不是强制要求,但这是一个成熟运维人员的习惯。

第二步:执行安装并验证

现在,执行最核心的命令:

sudo dnf install -y nodejs

-y 参数表示“自动确认所有提示”,避免交互式询问。 dnf 会从 appstream 仓库中查找 nodejs 包,计算依赖关系(主要是 npm python3 等),然后下载并安装。安装完成后,立即验证:

node --version
npm --version

你应该看到类似 v18.18.2 8.19.2 的输出。注意,这里的 npm 版本是随 nodejs 包一起安装的,它和 Node.js 主版本是强绑定的。Node.js 18.x 自带的 npm 就是 8.x,这是官方组合,不要试图用 npm install -g npm@latest 去强行升级,这极有可能破坏 npm 的内部结构,导致 npm ci npm audit 命令失效。

第三步:一个关键的“反直觉”操作——禁用 npm update

很多刚接触 Node.js 的人,看到 npm --version 输出的是 8.19.2 ,而官网 npm 最新版本已经是 10.x ,就会本能地想 sudo npm install -g npm@latest 请立刻打住! 这是 dnf 方案下最危险的操作。 dnf 安装的 npm ,其二进制文件位于 /usr/bin/npm ,而 sudo npm install -g npm@latest 会把新版本的 npm 安装到 /usr/local/bin/npm 。由于 /usr/local/bin 通常在 $PATH 中排在 /usr/bin 前面,所以 npm --version 会显示新版本,但 npm 的内部逻辑(比如它查找 node_modules 的方式、它读取的配置文件路径)可能已经和 /usr/bin/node 不匹配了。我亲眼见过一个案例: npm install 成功,但 npm run dev 启动的进程, process.version 居然还是 v18.18.2 ,而 process.execPath 却指向了 /usr/local/bin/node ,结果整个应用在 require('fs/promises') 时崩溃,因为 fs/promises 是 Node.js 14.17+ 才引入的,而 npm 的启动脚本却错误地调用了旧的 node 。所以,对于 dnf 方案,我的铁律是: 接受它自带的 npm,不升级,不折腾 。如果你的应用确实需要更高版本的 npm 功能,那说明 dnf 方案已经不适合你了,该换方案了。

3.2 方案二:NodeSource 仓库(推荐生产环境,平衡安全与前沿)

这是我在客户生产环境中部署 Node.js 服务时,90% 的首选方案。它把 dnf 的确定性和 Node.js 的前沿性结合得恰到好处。

第一步:获取并执行 setup 脚本

NodeSource 为不同主版本提供了不同的 setup 脚本。根据你的需求,选择一个。目前(2024年中),Node.js 20 是 LTS(长期支持),Node.js 22 是 Current(最新稳定版),Node.js 24 尚未发布。我们以最稳妥的 20.x 为例:

curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -

这条命令的每一个字符都有深意: curl -fsSL 中的 -f 表示失败时不输出错误页面(只返回错误码), -s 是静默模式(不显示下载进度), -S 是即使静默也显示错误信息, -L 是跟随重定向(NodeSource 的 URL 可能会重定向到 CDN)。 | sudo bash - 表示把下载下来的脚本内容,直接通过 sudo 权限交给 bash 执行。这个脚本会自动检测你的系统是 el9 (Rocky Linux 9),然后为你配置好 nodesource.repo 和 GPG 密钥。

第二步:安装并验证

脚本执行成功后,你会看到类似 ## Installing the NodeSource Node.js 20.x repo... 的输出。接下来,就是熟悉的 dnf 安装:

sudo dnf install -y nodejs

这一次, dnf 会从刚刚添加的 nodesource 仓库中查找 nodejs 包,而不是 appstream 。安装完成后,验证:

node --version
npm --version

你应该看到 v20.12.0 (或当时最新的 20.x 版本)和 10.5.0 (或对应 npm 版本)。注意, npm 版本也升级了,这是因为 NodeSource 的 nodejs 包,是把 Node.js 和 npm 作为一个整体打包的,它们的版本是官方认证的黄金组合。

第三步:理解并利用 NodeSource 的版本管理

NodeSource 的强大之处,在于它让你可以用 dnf 的方式,管理多个主版本。假设你今天装了 20.x ,但明天你的一个新项目明确要求 22.x 。你不需要卸载重装,只需两步:

  1. 禁用旧仓库,启用新仓库

    # 禁用 20.x 仓库
    sudo dnf config-manager --disable nodesource
    # 启用 22.x 仓库(先运行 setup)
    curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
    
  2. 重新安装

    sudo dnf install -y nodejs
    

dnf 会自动卸载旧的 nodejs 包,并安装新的 22.x 包。整个过程是原子的、可回滚的。 dnf history 命令会清晰地记录下这次操作,你可以随时 dnf history undo <id> 回退。这种“版本即配置”的管理范式,是 nvm 无法比拟的。它让 Node.js 的版本变更,从一个需要人工干预的“操作”,变成了一个可以纳入 CI/CD 流水线的“声明式配置”。

3.3 方案三:nvm(开发者专属,灵活至极)

nvm 是为那些需要在同一个 shell 里,像变魔术一样切换 Node.js 版本的人准备的。它的安装和使用,充满了“shell 黑魔法”的味道。

第一步:安装 nvm

nvm 的官方安装方式,就是用 curl 拉取脚本。这是最可靠的方式,因为它直接来自 nvm-sh/nvm 的 GitHub 仓库:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

注意,这里指定了具体的 tag v0.39.7 nvm 的安装脚本本身也在不断迭代,指定一个稳定的 tag,可以避免因脚本更新而带来的意外行为。执行后,脚本会把 nvm 安装到 ~/.nvm ,并修改你的 shell 配置文件( ~/.bashrc ~/.zshrc )。 此时,你必须重新加载配置文件,或者新开一个终端,才能让 nvm 命令生效 。最简单的方法是:

source ~/.bashrc
# 或者,如果你用的是 zsh
source ~/.zshrc

然后,输入 nvm --version ,如果输出 0.39.7 ,恭喜, nvm 已经就位。

第二步:安装并切换 Node.js 版本

nvm 的核心命令是 nvm install nvm use 。我们来安装两个常用版本:

# 安装最新的 LTS 版本(目前是 20.x)
nvm install --lts
# 安装最新的 Current 版本(目前是 22.x)
nvm install node

nvm install --lts 是一个便捷命令,它会自动查找并安装最新的 --lts (即 --lts=hydrogen )版本。 nvm install node 则会安装 node 别名所指向的最新版本(即 node 这个别名,总是指向官网发布的最新稳定版)。安装过程会从 https://nodejs.org/dist/ 下载对应的 .tar.xz 包,然后解压到 ~/.nvm/versions/node/ 下。你可以用 ls ~/.nvm/versions/node/ 查看已安装的版本列表。

安装完成后,用 nvm use 切换:

nvm use --lts
node --version # 输出 v20.x.x
nvm use node
node --version # 输出 v22.x.x

你会发现, node --version 的输出随着 nvm use 命令瞬间改变。这就是 nvm 的魔法——它没有修改任何系统文件,只是在内存里动态地改变了 $PATH

第三步:设置默认版本与项目级自动切换

为了让 nvm 真正融入你的日常开发,你需要设置一个默认版本。这样,每次你打开新终端, nvm 都会自动 use 它:

nvm alias default 20.12.0

现在,无论你开多少个新终端, node --version 默认就是 v20.12.0

更进一步,你可以实现“项目级自动切换”。进入你的一个 Vue 3 项目目录,创建一个 .nvmrc 文件:

cd /path/to/your/vue3-project
echo "20.12.0" > .nvmrc

然后,每次你 cd 进入这个目录,只需执行:

nvm use

nvm 就会自动读取 .nvmrc 文件,并切换到 20.12.0 。你甚至可以把它写成一个 alias,放在 ~/.bashrc 里:

alias cd='nvm use 2>/dev/null || true; cd'

这样,每次 cd nvm 都会尝试自动切换,失败了也无害。这种无缝的、基于上下文的版本管理,是 nvm 独一无二的价值所在。

4. 常见问题与独家避坑指南:那些只有踩过才懂的坑

4.1 “nvm ls 报错 no installations recognized.” —— 权限与路径的双重迷宫

这是 nvm 新手最常遇到的报错。当你兴冲冲地 curl 安装完 nvm ,执行 nvm ls ,却看到 N/A no installations recognized. ,那一刻的心情,就像买了张去火星的船票,结果发现火箭没油。

这个问题的根源,99% 出在 shell 配置文件的加载顺序和权限 上。 nvm 的安装脚本,会把 export NVM_DIR="$HOME/.nvm" source "$NVM_DIR/nvm.sh" 这两行,追加到你的 ~/.bashrc (或 ~/.zshrc )末尾。但问题来了:如果你的 ~/.bashrc 里,有 return exit 这样的提前退出语句,或者有 if [ -z "$PS1" ]; then return; fi 这样的判断(很多发行版默认就有),那么,当 nvm 的代码被加载时,脚本可能在执行到一半就 return 了,导致 nvm 的函数根本没有被定义。

排查方法 :在终端里,直接输入 type nvm 。如果输出 bash: type: nvm: not found ,说明 nvm.sh 根本没被 source 进来。这时,检查你的 ~/.bashrc ,找到 nvm 相关的几行,把它们剪切出来,粘贴到文件的最开头,然后执行 source ~/.bashrc 。再试 type nvm ,应该能看到 nvm is a function

另一个常见原因是 ~/.nvm 目录的权限问题 nvm 安装时,会创建 ~/.nvm 目录,并把所有文件放进去。如果你之前用 sudo 执行过 nvm 相关命令,或者 ~/.nvm 目录的所有者被意外改成了 root ,那么,作为普通用户的你,就没有权限读取 ~/.nvm/nvm.sh source 命令就会静默失败。检查方法是 ls -la ~/.nvm ,看所有者是不是你自己的用户名。如果是 root ,执行 sudo chown -R $USER:$USER ~/.nvm 即可。

提示: nvm 的设计哲学是“用户私有”,它坚决反对 sudo 。任何 sudo nvm 的操作,都是在给自己挖坑。记住, nvm 只为你自己服务,它不需要 root 权限。

4.2 “error installing 24.16.0: node.js v24.16.0 is not yet released or is not available.” —— 时间差与版本号的幻觉

这个报错,往往出现在你看到某个技术文章或 GitHub issue 里提到了 Node.js v24.16.0 ,然后你满怀希望地 nvm install 24.16.0 ,结果却得到了这个错误。这不是 nvm 的 bug,而是你掉进了“版本号幻觉”的陷阱。

Node.js 的版本发布,遵循一个严格的语义化版本(SemVer)规则: MAJOR.MINOR.PATCH MAJOR (主版本)的升级,意味着不兼容的 API 变更; MINOR (次版本)的升级,意味着新增向后兼容的功能; PATCH (修订版本)的升级,意味着只修复 bug。 24.16.0 这个版本号,听起来很“新”,但它很可能根本就不存在。Node.js 的发布节奏是:每六个月发布一个 MAJOR 版本(偶数年 4 月和 10 月),然后在这个 MAJOR 版本的生命周期内,每月发布一个 MINOR 版本。所以,Node.js 24 的第一个版本,是 24.0.0 ,发布时间是 2024 年 4 月。之后, 24.1.0 24.2.0 …… 会陆续发布。但 24.16.0 意味着这个 MAJOR 版本已经发布了 16 个 MINOR 版本,这在现实中是不可能的,因为一个 MAJOR 版本的生命周期只有 6 个月,不可能支撑 16 个 MINOR

如何查证一个版本是否存在? 最权威的途径,是访问 Node.js 官网的下载页: https://nodejs.org/dist/ 。这个页面会列出所有已发布的、可供下载的 .tar.xz 包。你可以用浏览器打开,或者用命令行:

curl -s https://nodejs.org/dist/ | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | sort -V | tail -10

这个命令会抓取官网 dist 页面的 HTML,提取出所有形如 v20.12.0 的版本号,按语义化版本排序( sort -V ),然后显示最新的 10 个。你一眼就能看出, 24.16.0 是否真的存在。如果不存在,那 24.16.0 很可能是某个人在博客里随手写的笔误,或者是某个内部测试版的代号,从未对外发布。

注意: nvm install 命令,只会从 https://nodejs.org/dist/ 这个官方地址下载。它不会去 GitHub Releases 或其他任何地方找包。所以,如果官网没有, nvm 就一定装不了。

4.3 “nvm 安装后 npm 和 node 失效” —— PATH 环境变量的隐形战争

这是一个极具迷惑性的现象。你 nvm install 20.12.0 成功了, nvm use 20.12.0 也成功了, nvm current 显示 v20.12.0 ,但当你敲 node --version ,却报错 command not found: node 。或者, node --version 能输出,但 npm --version 却报错 command not found: npm

这几乎 100% 是 $PATH 环境变量被污染 的结果。 nvm use 的本质,是把 ~/.nvm/versions/node/v20.12.0/bin 这个路径,插入到 $PATH 的最前面。但如果在你的 ~/.bashrc ~/.profile 里,有其他脚本(比如某些 SDK 的初始化脚本、某些 IDE 的插件脚本)在 nvm 之后,又把 /usr/bin /usr/local/bin 强行放到了 $PATH 的最前面,那么, nvm 的努力就白费了。

诊断方法 :执行 echo $PATH ,仔细查看输出。你应该能在最前面看到 ~/.nvm/versions/node/v20.12.0/bin 。如果没有,那就说明有别的脚本在后面覆盖了它。执行 which node which npm ,看它们指向哪里。如果指向 /usr/bin/node ,那问题就明确了。

解决方案 :找到那个“捣乱”的脚本,把它挪到 nvm source 语句之前。或者,更彻底的办法,是在 ~/.bashrc 的末尾,加上一行:

export PATH="$NVM_DIR/versions/node/$(nvm current)/bin:$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值