You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Node.js中发起HTTP请求比浏览器fetch耗时更长?

1 两者存在性能差异的原因

  • 配置逻辑错误:你在Node.js请求参数中设置了pool: false,直接关闭了连接池,即使全局Agent开启了keepAlive也不会生效,每次请求都需要重新建立TCP连接、完成TLS握手,单这一项就会多出几十到上百毫秒的开销。
  • 计时逻辑不一致:浏览器fetch的计时截止到完整接收并解析完JSON响应体,而你的Node.js代码是在收到第一块响应数据时就停止计时,统计口径存在偏差。
  • 底层默认优化差异:浏览器默认内置了DNS缓存、TLS会话复用、HTTP/2自动降级逻辑,大部分场景下会复用之前和目标域名建立好的连接,省去连接建立开销;而Node.js原生http/https模块默认没有开启持久DNS缓存,TLS会话复用默认配置也比较保守,HTTP/2需要手动开启,默认走HTTP/1.1,连接复用效率更低。
  • 网络环境差异:如果运行浏览器的设备和运行Node.js的设备不在同一个网络环境,两者到第三方API的路由、带宽、基础延迟本身就存在差异,也会直接体现在请求耗时上。

2 提升Node.js请求速度的措施

  • 修正错误配置:删除请求参数中的pool: false,让请求复用开启了keepAlive的全局Agent,也可以单独实例化自定义Agent,调整keepAliveMsecs参数匹配第三方API的连接保持时长,最大化连接复用率。
  • 对齐计时逻辑:不要在res.on('data')事件中计算耗时,等res.on('end')事件触发、完整接收完所有响应数据后再计算耗时,和浏览器的统计口径保持一致,避免误判优化效果。
  • 增加DNS缓存:引入DNS缓存逻辑,避免每次请求都重新发起DNS查询,单这一项就可以减少10~50ms的DNS解析耗时。
  • 开启HTTP/2支持:如果第三方API支持HTTP/2,改用Node.js原生http2模块发起请求,利用HTTP/2的多路复用特性,进一步降低多并发请求的 overhead。
  • 启用TLS会话复用:调整Agent的maxCachedSessions参数,开启TLS会话缓存,省去重复TLS握手的开销,HTTPS请求单次可减少30~100ms的握手耗时。
  • 更换高性能HTTP客户端:放弃原生http/https模块,改用Node.js官方维护的高性能HTTP客户端undici,其默认内置了连接复用、HTTP/2支持、DNS缓存等优化,同等场景下比原生模块性能高30%以上。

3 两者的预期速度对比

在网络环境相同、双方都做了最优配置的前提下,Node.js发起请求的预期速度不会比浏览器fetch慢,甚至会更快。浏览器请求需要额外经过跨域校验、安全策略检查、扩展插件拦截、全局请求调度等上层逻辑,而Node.js的请求没有这些额外开销,可以直接发起到目标服务的网络请求。你当前测出来Node.js更慢完全是配置错误和默认优化不到位导致的。

内容的提问来源于stack exchange,提问作者Ggg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 05:06:04