Node.js 18+ 已原生支持全局 fetch API,但截至 2024 年 6 月的对比数据显示,Axios 在请求拦截、自动 JSON 转换和 IE11+ 兼容性方面仍保持优势,而 fetch 在 Node.js 环境中需要额外处理超时和错误状态码。
原因分析
Fetch API 是 modern 浏览器内置的标准 JavaScript API,Node.js 从 18 版本开始原生集成 fetch,无需额外安装依赖。根据 2024 年 6 月 18 日阿里云开发者社区的对比,fetch 返回 Promise 对象,但只在网络错误时 reject,HTTP 状态码如 404、500 不会触发 catch 块,需要手动检查 response.ok。Axios 作为第三方库,通过 npm 安装后在浏览器和 Node.js 环境中均完整支持,自动处理 JSON 转换和错误统一格式。
兼容性测试方案
第一步:验证 Node.js 版本和 fetch 可用性。在终端执行 node -v 确认版本为 19.x,然后运行 console.log(typeof fetch) 应返回 function。如果返回 undefined,说明需要安装 node-fetch 包,执行 npm install node-fetch。
第二步:基础请求对比测试。使用以下代码分别测试 fetch 和 axios 的 GET 请求:
fetch('https://api.example.com/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error('Error:', error));
axios.get('https://api.example.com/data').then(response => console.log(response.data)).catch(error => console.error('Error:', error));
第三步:超时控制测试。fetch 本身不支持 timeout,需结合 AbortController 实现:const controller = new AbortController(); fetch(url, {signal: controller.signal}); 超时后调用 controller.abort() 触发 TypeError('aborted')。Axios 内置超时支持,配置 timeout: 5000 即可。
第四步:认证与 Cookie 测试。fetch 默认不携带 Cookie,发送请求时需显式配置 credentials: 'include'(等同于 XHR 的 withCredentials = true)。JWT 场景常用 Authorization header: headers: {'Authorization': 'Bearer xxx'}。
争议方案与适用场景
方案一:完全替换为 fetch。适用场景为简单项目、不需要请求拦截和进度监控的情况。根据 2024 年 7 月 12 日的教程,fetch 提供现代化和原生的方式,但需要手动处理 JSON 解析和错误检查。
方案二:混合使用。在 Node.js 服务端使用 axios 获得完整功能支持,在浏览器端使用 fetch 减少包体积。根据 2025 年 11 月 21 日的资料,axios 支持 XSRF 保护和取消请求,适合企业级应用。
方案三:封装统一层。创建简易版 axios 工具,内部采用 fetch 实现,添加请求及响应拦截和超时取消功能。根据 2022 年 12 月 17 日的案例,浏览器环境使用 fetch 摒弃 xhr 封装,Node 环境使用 http 模块。
注意事项
注意 1:fetch 在 Node.js 18 之前需要 polyfill,IE 浏览器不支持 fetch API,如需兼容 IE11+ 应选择 axios。
注意 2:fetch 响应体需手动解析,使用 response.json()、response.text() 或 response.blob(),不能直接获取数据。
注意 3:业务错误(如 401)需在 then 中用!response.ok 判断,网络错误、abort、DNS 失败等统一走 catch。
注意 4:POST 提交 JSON 需 stringify 并设 headers,body 必须是字符串,不能直接传对象,必须显式设置 Content-Type: application/json。
参考来源
来源:阿里云开发者社区 - 前端 HTTP 请求库 Axios 与 Fetch 从功能到场景的深度对比选型(2024 年 6 月 18 日发布)
来源:CSDN 博客 - Axios 与 Fetch API 深度对比:选择最适合的 HTTP 客户端(2025 年 8 月 22 日)
来源:技术教程 - 如何用 Fetch API 替代传统的 XMLHttpRequest 异步请求(2026 年 3 月 26 日)
来源:GitHub 案例 - JS 案例:实现一个简易版 axios(2022 年 12 月 17 日)
原文链接:https://www.zjcp.cc/ask/9678.html
