ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Node.js 18+版本选择与安装避坑指南:从LTS到多系统实操

Node.js 18+版本选择与安装避坑指南:从LTS到多系统实操 说句实在话这几年帮团队折腾开发环境我见过太多项目卡在第一步“装 Node.js”上有的同事从官网点了最新版第二天依赖装不上有的照着旧教程装了个 12一跑项目就报The requested module node:util does not provide an export named还有人在管理工具里挑了半天结果选了个根本不存在的版本号提示is not yet released or is not available。这些问题其实都和一件事有关——你装的 Node.js 版本对不对。现在的主旋律很清楚Node.js 18 已经是绝大多数现代工具链的底线。不管你是做前端工程化、写后端接口、搞嵌入式上位机、还是基于 Node 搭博客先理解“为什么必须 ≥ 18”比单纯复制粘贴命令重要得多。这篇文章我会把版本选择的逻辑、三大系统的安装方式、安装后的环境配置、以及几个真实频率很高的报错和项目场景一次讲透保证你看完能直接照着操作不再踩我踩过的坑。1. 为什么现在是 Node.js 18版本门槛背后的逻辑1.1 Node.js “是干什么的”与 18 分水岭Node.js 简单来说就是一个让你用 JavaScript 写服务端程序的运行时它把 Chrome 的 V8 引擎搬到服务器上又加了一堆处理文件、网络、进程的模块。早期很多人觉得它只是“前端的玩具”但发展到现在它已经是构建工具链、接口服务、桌面应用、嵌入式脚本、甚至 IoT 网关的主流底座。那为什么偏偏是 18因为 Node.js 从 18 开始进入了一个很关键的“现代期”。从 18 开始内置了全局fetch不需要再额外装node-fetch从 18 开始有了原生的测试运行器node:test写单测不用再从头搭一套 Jest从 18 开始node:util里的parseArgs成为稳定 API很多 CLI 工具默认要求它也是从 18 开始Experimental的corepack和npx的体验大幅提升。换句话说社区里大量主流工具和框架——Vite 5、Next.js 14、Nuxt 3、Hexo 7、SerialPort 的很多版本——都把engines字段最低要求写成了18。我自己遇到的一个典型例子是某次项目里用了某个依赖库安装时没报错一运行就抛The requested module node:util does not provide an export named parseArgs查了半天才发现那台开发机的 Node 是 16.15而parseArgs要 Node 18.3 才比较稳定。所以“≥ 18”不是别人随便定的门槛是下游依赖对上游能力的基本要求。你可以把 Node 版本想象成手机系统App 更新到一定版本后就不再支持老系统不是你手机坏了是系统太旧了。1.2 选 LTS 版本而不是“最新版”打开 Node.js 官网你会看到两列下载LTS长期支持版和 Current当前最新版。很多新手顺手就点了 Current觉得新的就是好的。但从稳定性和生态兼容角度装 LTS 几乎总是对的。Node.js 版本发布节奏固定双数月4月/10月会发布新版本其中偶数版本会进入 LTS 长期维护奇数版本只做测试。比如 18、20、22 这批是 LTS19、21、23 这批是过渡版本。LTS 意味着该版本会持续收到安全补丁和 bug 修复而过渡版本一般生命周期就 6-12 个月到时候没有平滑升级路径。社区里常说的“建议用 20 LTS 或 22 LTS”正是这个原因。我建议的版本区间很简单使用场景推荐版本新项目、新团队、无历史包袱Node.js 22 LTS公司存量项目或老依赖较多Node.js 20 LTS必须用某些旧原生模块Node.js 18 LTS测试新特性、纯学习Node.js 24 Current不建议生产为什么我不推荐一上来装 24 Current因为很多原生模块比如node-sass、serialport、sharp的预编译二进制可能还没跟上装了之后经常要现场编译而编译又要依赖 Python、C 工具链纯属给自己找麻烦。反过来说18/20/22 这三个 LTS 版本里绝大多数 npm 包都有现成的预编译版本安装体验最顺滑。1.3 从热词看真实需求版本坑远比想象中多我顺手翻了翻大家在搜什么除了“Node.js 安装教程”这种基础问题外还有几个有意思的搜索词“node.js 读取秤的重量”“node.js、python 3.10、esp32”“基于node.js的博客”。这说明相当一部分人不是纯前端而是做硬件对接、物联网、全栈博客开发的。这类场景恰恰是对 Node 版本比较敏感的比如读取电子秤通常要装serialport较新的serialport版本对 Node 版本有明确要求Node 16 以下经常编译失败再比如搭配 ESP32 做数据采集时上位机脚本里会用到 WebSocket、MQTT 等库这些库往往也需要 Node 18。还有一条热词很典型node.js v24.21.0 is not yet released or is not available.。这是用版本管理工具或某些一键安装脚本时指定了一个不存在的版本号导致的。很多人以为版本号随便填就行结果工具去下载对应包时发现官方根本没发布过这个版本。这正好说明了解版本规则、会用正确的版本管理工具比会点“下一步”重要得多。2. 安装前必须搞清楚的三件事2.1 先看系统架构你的电脑是 x64 还是 ARM开始安装之前首先要确认操作系统架构。Windows 上右键“此电脑”→“属性”就能看到“系统类型”常见的是x64或ARM64macOS 要看 是 Intel 还是 Apple SiliconM1/M2/M3Linux 可以用uname -m查看一般输出x86_64或aarch64。架构选错的下场通常是下载了安装包但装不上或者装上后node -v一执行就崩溃。比如 Apple Silicon 的 Mac 如果下载了 x64 版 Node虽然 Rosetta 能转译运行但后续装原生模块时性能会打折而且可能遇到签名问题。所以务必选对架构对应的安装包。2.2 检查是否已有 Node避免环境混乱很多机器其实已经不是“全新状态”了可能装过某个软件自带了老版本 Node或者用过 Homebrew、apt 等包管理器装过。所以安装前我一般会先跑这几条命令node -v npm -v which node如果node -v能输出版本先看一下是多少。低于 18 的话别急着直接覆盖安装先想想有没有项目依赖这个老版本。企业内网的老项目、某些 Electron 应用内置的 Node、或者某些 IDE 插件自带的 Node都可能导致你把系统全局 Node 换掉后别的软件反而启动不了。这时候不要用安装包覆盖建议用版本管理工具多版本共存。另外提醒一句which node能帮你确认当前用的是哪个路径下的 Node。很多人装了新版本但终端里执行到的还是旧版就是因为 PATH 顺序不对。比如 Windows 上系统自带的老路径排在前面而你新装的 Node 路径排在后面自然“改了等于没改”。2.3 版本管理工具不是可选项是必需品如果你只装一次 Node 以后完全不动那用官方安装包确实够了。但开发这事谁说得准呢今天用 Node 18 跑老项目明天可能就要用 Node 22 跑新项目后天没准还要切回 Node 20 验证某个问题。所以我强烈建议从一开始就使用版本管理工具。Windows推荐nvm-windows注意和 Linux/Mac 的 nvm 是不同项目但命令基本一致macOS / Linux推荐nvm或者更新的fnm进阶如果觉得 nvm 切换速度不够快可以试试fnm它是 Rust 写的性能好很多也能在 PowerShell 下用版本管理工具的好处是Node 安装路径统一由它管理切换版本只需要一条命令全局安装的包在不同版本间也不会互相污染。你装错了某个版本删掉重来也一样方便。后面所有安装步骤我都会以“用版本管理工具”为主线来讲。3. 三大主流系统的安装实操3.1 Windowsnvm-windows 安装 Node 20 LTSWindows 上我建议走nvm-windows方便、干净、卸载也容易。第一步先到 GitHub 的coreybutler/nvm-windows仓库下载最新 release 的nvm-setup.exe。运行安装程序时它会让你选两个目录一个是 nvm 自身的安装目录一个是 Node 版本符号链接的存放目录。默认位置其实能用但我习惯把 nvm 放到D:\nvm、Node 符号链接放到D:\nodejs这样做系统重装时不容易丢配置。安装完成后打开 PowerShell 或 CMD运行nvm version看到版本号就说明装好了。接着安装 Node 20 LTS 并切换使用nvm install 20 nvm use 20 node -v npm -v如果你在 PowerShell 里执行nvm use 20时提示“请使用管理员身份运行”那就右键以管理员身份打开终端。这是 Windows 符号链接权限导致的不算 bug不用慌。如果不想用 nvm-windows直接用官方安装包也可以下载.msi安装包一路 Next勾选“Add to PATH”即可。但缺点是一旦你后来想切换版本就得手动安装、手动改 PATH确实麻烦。3.2 macOS用 nvm 避免 Homebrew 的版本滞后问题macOS 上最省事的方案是先用 Homebrew 安装 nvm然后再用 nvm 安装 Nodebrew install nvm装完 nvm 会提示你创建目录并加载环境变量。按提示执行mkdir ~/.nvm然后把下面几行加到~/.zshrcexport NVM_DIR$HOME/.nvm [ -s /opt/homebrew/opt/nvm/nvm.sh ] . /opt/homebrew/opt/nvm/nvm.sh有两类问题提醒一下如果你是 Apple SiliconM 系列芯片Homebrew 路径是/opt/homebrew如果是 Intel Mac则是/usr/local环境变量路径要对应修改。另外很多教程会教brew install node这条路虽然快但装出来的版本取决于 Homebrew 当前维护的版本不一定是 LTS也不方便切版本。我自己的做法是系统里的 Node 一律交给 nvm 管Homebrew 只负责安装其它工具。配置好之后打开新的终端运行nvm install --lts nvm use --lts node -v--lts会自动安装当前最新的 LTS 版本。如果想装指定版本比如 20就执行nvm install 20。3.3 Linux不要直接用 apt 装旧版Linux 上最大的坑是系统包管理器里的 Node 版本通常很老。以 Ubuntu 为例直接用sudo apt install nodejs npm装出来的往往是 12.x 或 14.x这在今天基本没法用。我有次在一台新服务器上偷懒走了这条捷径结果部署项目时一脸懵所有新语法全报错最后还是老老实实卸载重装了。推荐两种方式第一种用nvm安装和 macOS 类似curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash脚本执行完会往~/.bashrc里写入环境变量重新加载即可source ~/.bashrc nvm install 22 nvm use 22第二种如果你更希望用系统服务管理 Node比如 systemd 直接跑服务可以用 NodeSource 的 apt 仓库curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt-get install -y nodejs安装完成后验证node -v npm -v无论哪种方式装完建议先跑一下node -e console.log(process.version)确认已经是目标版本。因为我遇到过某些情况下 apt 自动把旧的nodejs包又拉回来导致 PATH 前面的旧版本覆盖了新版本。3.4 安装完成后必做的三步验证装完之后不要直接开项目先做三步验证能筛掉一大半后续问题第一步确认版本号和安装路径node -v npm -v which node which npm第二步确认 npm 默认 registry 可用npm config get registry如果输出的是https://registry.npmjs.org/在国内环境可能比较慢后面我会讲怎么换镜像。第三步跑一个最小的模块加载测试node -e import(node:util).then(m console.log(typeof m.parseArgs))如果输出function说明这个版本自带parseArgs以后不会再见到那个让人崩溃的node:util导出报错。这一步尤其适合验证“这个版本到底是不是 ≥ 18”。4. 安装后的环境配置与生态工具4.1 配置 npm 镜像下载速度立竿见影很多人装完 Node第一件事是npm install然后卡在进度条半天不动。这不是 Node 的问题是默认源在国外。国内用户我建议把 registry 切到 npmmirrornpm config set registry https://registry.npmmirror.com设置后验证npm config get registry输出变成https://registry.npmmirror.com/就说明生效了。有几点经验补充第一镜像只影响 npm 包的下载不影响 Node 运行时本身第二发布包时记得切回官方源否则可能因为镜像同步延迟导致版本不一致第三如果是公司自建 npm 私服同样用npm config set registry指过去即可思路完全一样。4.2 corepack pnpm现代包管理的标配Node 18 自带了corepack虽然默认实验性但建议开启它可以在项目级别锁定包管理器版本避免“你用的 pnpm 版本跟我用的不一样”这种团队协作问题corepack enable然后就可以通过 corepack 调用 pnpm 和 yarncorepack prepare pnpmlatest --activate pnpm -v如果不想用 corepack也可以直接全局安装npm install -g pnpm我个人经验是多项目并行时pnpm 在磁盘占用和安装速度上优势明显尤其是 monorepo 结构。安装完 pnpm 后配合 Node 18 的node --watch、node --env-file这些特性日常开发体验会提升不少。4.3 PATH 排查为什么装了新版却还在用旧版Node 版本对不上多数情况不是没装好而是 PATH 顺序问题。Windows 上可以打开“环境变量”检查Path里是否有多个 Node 相关路径macOS/Linux 上执行echo $PATH看看 nvm 的路径是不是在系统自带的 Node 路径之前。如果发现/usr/local/bin/node之类的路径靠前可以改~/.zshrc或~/.bashrc里的导出顺序。另外Windows 下有个特别隐蔽的坑有些软件在安装时会把一个 Node 运行时复制到自己目录下然后注册到系统 PATH 里比如某些 IDE 的插件。这种时候即使你成功装了新的 Node终端里也可能一直执行旧路径的版本。排查方法是执行where node把所有 node 路径列出来看看排序第一的是不是 nvm 管理的那个。如果不是手动调整 PATH。4.4 常用全局工具把这些装上能省很多事装好 Node 并配置完 npm 之后我一般会顺手装几个全局工具npm install -g nodemon npm install -g cross-env npm install -g rimrafnodemon用于本地开发时监听文件变化自动重启服务cross-env解决 Windows 和 macOS/Linux 下设置环境变量语法不一致的问题rimraf跨平台删除目录很干净。这些工具对 Node 版本要求不高但还是建议在 Node 18 环境下安装以免某些依赖版本不兼容。如果你打算用 Node 做博客或文档站点可以装个hexo-clinpm install -g hexo-cli注意 Hexo 现在的高版本对 Node 版本有明确要求通常是18和前面说的门槛完全对应。5. 高频报错排查与项目场景落地5.1 “The requested module node:util does not provide an export named”——版本太旧这个报错是很多人在 Node 17 或更早版本上跑新项目时看到的。字面意思是代码里import { parseArgs } from node:util但当前 Node 的node:util模块没有导出parseArgs。原因很简单parseArgs在 Node 18.3 以后才进入稳定状态Node 16 和 17 要么完全没有要么只有实验版。如果你遇到这个错先确认版本node -v如果是 16 或更低直接升级到 18 即可。升级后重跑node -e import(node:util).then(m console.log(m.parseArgs.toString().slice(0,40)))能输出函数内容就说明导出正常。这个报错给我们的启示是下次看到“某个模块没有导出的名字”这种错误时先怀疑 Node 版本再看代码。老项目要升版本前扫一遍项目里有没有用旧 API免得升级后又有新报错。5.2 “v24.21.0 is not yet released or is not available”——版本号瞎选报错全文大体是Node.js v24.21.0 is not yet released or is not available.意思很简单你指定的版本号在官方发布列表里不存在。常见原因有两个一是版本管理工具里把版本号写错比如写成v24.21.0但实际发布可能只到v24.8.0二是某个自动化脚本或 Dockerfile 里写死了未来版本号被拉下来执行时自然找不到。处理方式先查一下哪些版本可用。用 nvmnvm ls-remote用 fnmfnm list-remote然后选择一个真实存在的版本安装。如果你非要用 24也请先确认官方是不是已经发到了那个具体的小版本再动手。这个错误看起来低级但我在 CI 流水线里真见过不少次脚本里的版本号长期没更新某天底层镜像重做后整个人都懵了。5.3 硬核应用一Node.js 读取电子秤的重量这大概是热词里最有意思的一个我展开讲讲。很多工业/商业场景里电子秤通过 RS232 串口或 USB 转串口连接电脑Node.js 完全可以当上位机读取重量数据。首先要安装串口库注意它要求 Node 版本不能太低npm install serialport然后在 Node 18 里写一个最小脚本import { SerialPort } from serialport; const port new SerialPort({ path: COM4, // Windows 示例macOS/Linux 通常是 /dev/ttyUSB0 或 /dev/tty.usbserial-* baudRate: 9600, // 电子秤常见默认波特率具体看说明书 autoOpen: false, }); port.open((err) { if (err) { console.error(打开串口失败:, err.message); return; } console.log(串口已打开); }); port.on(data, (data) { const text data.toString(ascii).trim(); console.log(原始数据:, text); // 通常电子秤会输出类似 12.34 kg 的文本按格式解析 const match text.match(/(\d\.?\d*)\s*(kg|g|t)?/i); if (match) { console.log(重量:, match[1], match[2] || kg); } });这里有几个经验第一串口号不能猜Windows 上打开设备管理器看“端口COM 和 LPT”macOS 上可以用ls /dev/tty.*第二波特率、校验位、数据位必须和秤的设置一致常见组合是 9600/8/N/1但不同品牌差异很大第三串口数据是一段一段的尤其读取连续重量时会有多帧数据需要按星号、换行符等分隔符拆包我这只是一个最简示例。这个场景和 Node 版本的关系很直接serialport的高版本 N-API 模块需要较新的 Node 运行时否则安装时就会因为缺少预编译二进制而触发源码编译那时候要面对的就不只是 Node 本身的问题了。5.4 联合场景Node.js Python 3.10 ESP32很多人会在硬件项目里看到类似组合ESP32 采集传感器数据通过串口或 WiFi 发给电脑电脑端的 Node.js 服务接收数据、做实时展示或转发Python 3.10 则负责复杂的数据分析和模型计算。Node 在这里扮演的是“实时网关”角色因为它的异步 I/O 和高并发连接能力非常适合处理设备上报。一个比较典型的结构是ESP32 采集温湿度、电压等数据通过 MQTT 或 WebSocket 发到 Node.js 服务Node.js 服务使用ws或mqtt包接收数据再广播给 Web 页面Node.js 收到一批数据后调用 Python 脚本做异常检测结果返回给前端要跑通这条链路Node 18 几乎是必须的npm install ws mqtt启动 Node 服务后页面通过 WebSocket 实时看到设备数据。此时 Python 脚本可能还在分析历史数据两边各司其职。这个组合里最容易出问题的点除了 Node 版本还有node-gyp编译链。如果某个原生依赖需要现场编译Windows 上要装 Visual Studio Build ToolsmacOS 要装 Xcode Command Line ToolsLinux 要装build-essential。Node 版本越旧对编译工具链的版本要求越苛刻越容易失败。因此推荐用 Node 20/22 LTS可以在很大程度上避开“原生模块要折腾编译环境”的悲剧。5.5 应用实践基于 Node.js 搭一个博客“基于 Node.js 的博客”是搜索热词也是很多人的第一个 Node 项目。最省事的是用 Hexo、VitePress 这类静态站点生成器npx hexo init my-blog cd my-blog npm install npx hexo server然后访问http://localhost:4000就能看到本地博客了。这一步能不能顺畅跑起来跟 Node 版本关系很大。Hexo 7 的要求就是 Node 14 以上但实际用 Node 18/20 明显更顺VitePress 更是明确要求 Node 18。如果你想更“后端一点”可以试试用 Express 自己写mkdir my-node-blog cd my-node-blog npm init -y npm install express然后创建index.jsimport express from express; const app express(); const port process.env.PORT || 3000; app.get(/, (req, res) { res.send(h1Hello Node.js Blog/h1); }); app.listen(port, () { console.log(Blog server running at http://localhost:${port}); });跑起来node index.js这里有件事我特别想强调Node 18 开始可以直接用顶层import不需要再写require文件后缀用.mjs或者在package.json里加type: module即可。旧版教程里那一堆 Babel 配置、构建工具配置在今天的环境下基本可以省掉。你要是看到有文章让你先装一堆转译器才能用 ES Module多半是教程写得太早了。6. 报错速查表与个人经验总结最后把我这段时间遇到的各种“安装/版本类”问题整理成一张表方便你按图索骥现象可能原因处理方式node -v显示 v16 或更低旧版本未更新用 nvm 安装 20/22 LTS 并切换node:util无导出parseArgsNode 18.3升级到 Node 18安装包下载完成但图标打不开系统架构选错确认 x64/ARM 后重新下载终端里node还是旧版本PATH 顺序不对用where node/which node排查is not yet released or is not available版本号不存在用nvm ls-remote查正确版本npm install卡住不动默认源太慢切换 npmmirror 镜像原生模块编译失败缺编译工具链或 Node 版本太旧升级 Node LTS按系统装编译工具我一贯的做法是新环境一律先用 nvm 安装当前 LTS比如 20 或 22项目里如果某个依赖需要更高版本再单独用.nvmrc文件锁定。.nvmrc的内容很简单比如20然后在项目根目录执行nvm usenvm 就会自动读取这个文件并切换版本。这样多项目并行互不干扰。另外一个小建议装完 Node 之后顺手把npm audit的提示养成习惯虽然有依赖漏洞提示并不代表项目一定会被攻击但它能帮你尽早发现版本不匹配的问题。Node 生态更新相当快保持 LTS 版本在支持周期内是成本最低的维护策略。这次的内容基本覆盖了从“为什么要 ≥ 18”到“装完怎么验证”再到“真实项目怎么落地”的完整链路。我在多个系统上用这套流程装过不下几十次只要版本号和架构选对后面基本都是一路顺畅。如果你之后还在安装或使用 Node 的过程中遇到什么奇怪的报错先别急着搜“解决方案”回到这篇教程从版本、PATH、镜像三个维度排查一下大概率能找到答案。
返回列表