在 Node.js 服务端请求第三方接口时,node-fetch 因轻量级设计在简单场景下通常性能表现更好,而 Axios 适合需要拦截器或自动 JSON 转换的复杂场景。选择 node-fetch 需注意 v3 版本仅支持 ES Modules,旧项目升级存在兼容性风险。
先说结论:追求轻量标准和简单请求选 node-fetch,需要高级功能和兼容旧代码选 Axios。
- 适合:高并发简单请求、希望代码与浏览器 Fetch API 保持一致的项目
- 重点看:错误处理机制差异,node-fetch 需手动检查 response.ok,Axios 自动 reject 非 2xx 状态
- 别忽略:node-fetch v3 仅支持 ES Modules,CommonJS 项目需降级使用 v2 或配置转换
快速处理思路
性能对比不能仅凭理论,建议在真实业务场景中通过基准测试验证。先定位当前请求瓶颈是网络延迟还是库处理开销,再选择工具。
如果项目是新启动且使用 ES Modules,优先测试 node-fetch;如果是维护中的 CommonJS 项目或需要请求拦截功能,直接使用 Axios 更稳妥。
为什么会这样
性能差异主要源于架构设计与依赖体积不同。node-fetch 专注于实现 Fetch API 标准,代码量少且依赖少;Axios 是基于 Promise 的完整 HTTP 客户端,封装了更多功能导致体积较大。
公开资料中没有看到可靠的量化数据表明具体快多少百分比,但 node-fetch 由于其轻量级设计,在简单请求场景下通常表现出更好的性能。Axios 体积约 13KB,而 node-fetch 作为标准实现更轻量,减少了运行时解析开销。
分步处理
第一步:安装依赖。使用 npm 安装对应库,node-fetch 命令为npm install node-fetch,Axios 命令为npm install axios。
第二步:编写测试脚本。创建benchmark.js,分别用两个库发起相同数量的并发请求,记录开始和结束时间。
第三步:运行对比。使用node benchmark.js执行脚本,观察控制台输出的总耗时和内存占用情况。
怎么验证是否生效
检查脚本输出的平均响应时间和每秒请求数(RPS)。如果 node-fetch 在相同网络条件下耗时更低且内存增长更平缓,说明轻量级优势生效。
查看进程内存快照,确认没有因库内部机制导致的异常内存泄漏。生产环境建议通过 APM 工具监控实际接口的 P99 延迟变化。
常见坑
node-fetch 不会自动 reject HTTP 错误状态码。服务器返回 400 或 500 时,fetch Promise 仍会 resolve,必须手动检查response.ok属性,否则错误会被静默忽略。
node-fetch v3 不再支持 CommonJS 的 require 语法。旧项目直接升级会导致报错ERR_REQUIRE_ESM,需修改 package.json 类型或降级使用 v2 版本。
默认不带 Cookie。node-fetch 默认不发送 Cookie,需要显式配置credentials: 'include',而 Axios 在特定配置下默认行为不同。
常见问题
node-fetch 和 Axios 哪个错误处理更方便?
Axios 更方便。Axios 会自动将非 2xx 状态码视为错误并触发 catch,node-fetch 需要手动判断 response.ok 状态。
Node.js 原生支持 fetch 吗?
Node.js 18 及以上版本原生支持 fetch API。低于该版本需要安装 node-fetch 包作为 polyfill 实现。
Axios 体积大会影响性能吗?
服务端场景影响较小。13KB 的体积对 Node.js 启动时间影响微乎其微,主要性能差异体现在运行时处理逻辑的复杂度上。
参考来源
Node-fetch vs Axios:2024 年 Node.js HTTP 请求终极对决指南
Awesome Node.js HTTP 客户端对比:Axios、Got、Node-fetch 深度评测
axios 和 fetch 异同点
Axios 与 Fetch 的详细对比解释