swr、axios和fetch的区别

372 阅读4分钟

useSWRaxiosfetch 是前端常用的数据获取工具,但它们在设计理念、使用场景和功能上有显著区别。以下是对它们的对比和分析:


1. fetch

  • 类型: 原生 JavaScript API
  • 简介: fetch 是浏览器内置的 HTTP 请求工具,用于发送网络请求并获取响应。它是现代替代 XMLHttpRequest 的标准方法。
  • 特点:
    • 轻量简单: 无需引入额外依赖,直接在浏览器或 Node.js(需 polyfill 或新版支持)中使用。
    • 基于 Promise: 返回 Promise,支持 async/await 语法。
    • 手动处理: 需要手动处理 JSON 解析、错误状态码(fetch 默认不会抛出 HTTP 错误,如 404、500,需要检查 response.ok)。
    • 无内置缓存: 每次请求都是全新的,需自行实现缓存逻辑。
    • 配置灵活: 支持自定义 headers、method、body 等,但配置稍显繁琐。
  • 使用场景: 适合简单请求、对依赖体积敏感的项目,或需要完全控制请求逻辑的场景。
  • 示例:
    async function getData() {
      const response = await fetch('https://api.example.com/data');
      if (!response.ok) throw new Error('Network response was not ok');
      const data = await response.json();
      return data;
    }
    

2. axios

  • 类型: 第三方库
  • 简介: axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js,提供更高级的请求处理功能。
  • 特点:
    • 功能丰富: 自动处理 JSON 解析、支持请求/响应拦截器、超时设置、取消请求等。
    • 错误处理: 自动抛出 HTTP 错误(如 404、500),无需手动检查状态码。
    • 配置简洁: 通过配置对象设置 headers、params 等,语法直观。
    • 无内置缓存: 类似 fetch,需要手动实现缓存逻辑。
    • 跨环境支持: 浏览器和 Node.js 通吃,适合复杂项目。
    • 拦截器: 支持全局或实例级拦截器,方便统一处理请求/响应(如添加 token、错误提示)。
  • 使用场景: 适合需要复杂请求管理(如拦截器、取消请求、统一错误处理)的项目。
  • 示例:
    import axios from 'axios';
    
    async function getData() {
      try {
        const response = await axios.get('https://api.example.com/data');
        return response.data;
      } catch (error) {
        console.error('Error:', error);
      }
    }
    

3. useSWR

  • 类型: React Hook(第三方库)
  • 简介: useSWR 是基于 React 的数据获取 Hook,专为 React 应用设计,内置缓存和自动重新请求机制。SWR 代表 "stale-while-revalidate"(先返回缓存数据,同时验证更新)。
  • 特点:
    • 专为 React 优化: 与 React 组件生命周期深度集成,简化数据获取和状态管理。
    • 内置缓存: 自动缓存请求结果,同一 key 的请求复用缓存,减少重复请求。
    • 自动重新验证: 支持轮询、焦点重新验证(refetch on focus)、间隔重新验证等,适合动态数据场景。
    • 状态管理: 返回 dataerrorisLoading 等状态,简化 UI 渲染逻辑。
    • 依赖底层工具: 通常搭配 fetchaxios 作为实际请求工具。
    • 轻量: 专注于数据获取和缓存,不提供拦截器等复杂功能。
  • 使用场景: 适合 React 项目中需要高效数据获取、缓存和实时更新的场景(如仪表盘、列表页)。
  • 示例:
    import useSWR from 'swr';
    
    const fetcher = (url) => fetch(url).then((res) => res.json());
    
    function Component() {
      const { data, error, isLoading } = useSWR('https://api.example.com/data', fetcher);
    
      if (isLoading) return <div>Loading...</div>;
      if (error) return <div>Error: {error.message}</div>;
      return <div>Data: {JSON.stringify(data)}</div>;
    }
    

主要区别对比

特性fetchaxiosuseSWR
类型原生 API第三方库React Hook
依赖需安装 axios需安装 swr,依赖 fetch/axios
缓存内置(基于 key)
错误处理手动(需检查 response.ok自动抛出 HTTP 错误自动(通过 error 返回)
自动重新验证支持(轮询、焦点重新验证等)
JSON 解析手动(response.json()自动依赖 fetcher(通常自动)
拦截器支持
适用场景简单请求、轻量项目复杂请求、跨环境项目React 项目、动态数据场景
学习曲线中(需理解 Hook 和 SWR 理念)

如何选择

  • fetch:
    • 项目对体积敏感,不想引入额外依赖。
    • 请求逻辑简单,无需复杂配置或拦截器。
    • 需要完全控制请求流程。
  • axios:
    • 需要拦截器、取消请求、超时等高级功能。
    • 项目跨浏览器和 Node.js 环境。
    • 希望简洁的 API 和自动错误处理。
  • useSWR:
    • 在 React 项目中,关注数据获取和 UI 渲染的整合。
    • 需要缓存、自动重新验证等功能(如实时数据展示)。
    • 希望简化状态管理(isLoadingerror 等)。

总结

  • fetch 是基础工具,适合简单场景。
  • axios 是功能强大的 HTTP 客户端,适合复杂请求管理。
  • useSWR 是 React 生态的利器,专为数据获取和状态管理优化,适合现代 React 应用。

如果你的项目是 React 驱动且需要动态数据,useSWR 通常是最佳选择;如果需要通用性或非 React 环境,axios 更灵活;若追求极简,fetch 就够了。