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

Next.js中SWR fallback选项实用示例及相关问题解答

SWR Fallback 实用示例与Next.js搭配答疑

一、核心疑问解答

  • 1. 官方示例为何用'/api/article'作为key?
    这个key是SWR用来缓存、识别请求的唯一标识,同时会作为参数传给你定义的fetcher函数。官方示例里的/api/article是Next.js的API路由(对应pages/api/article.js文件),作用是作为服务端中间层:既可以避免前端直接调用外部API的跨域问题,还能做数据过滤、鉴权等前置处理。

  • 2. useSWR钩子是否会通过该key跳转到对应地址?
    不是“跳转”,而是把key作为请求参数传给fetcher。比如你用fetch当fetcher,key就会成为fetch的第一个参数(请求地址),由fetcher发起HTTP请求获取数据。SWR本身只负责缓存、后台重新验证等逻辑,请求的实际发送是fetcher完成的。

  • 3. 能否使用外部API(比如jsonplaceholder)?
    完全可以。直接把外部API的完整URL作为key传给useSWR即可,比如:

    useSWR("https://jsonplaceholder.typicode.com/posts", fetcher)
    

    如果遇到跨域问题,要么让外部API开启CORS,要么用Next.js的API路由做代理转发。

  • 4. fallback对象中应填入什么值?
    fallback是给SWR提供初始数据的,它的键必须和useSWR的key完全匹配,值要和该key对应的请求返回数据结构一致。比如你请求/api/hello会返回{name: "xxx"},那fallback就填{"/api/hello": {name: "初始用户名"}}。

二、你的代码问题分析

你代码里fallback的foo bar短暂显示后变成John Doe,是SWR的正常行为:fallback只是临时初始数据,组件挂载后SWR会自动用fetcher请求/api/hello接口,接口返回的John Doe会替换掉初始值。

如果想让初始数据不被替换,可以关闭自动重新验证(设置revalidateOnMount: false),但这不符合fallback的设计初衷——它本来就是用来做预渲染或临时占位的,不是永久默认值。

实用修正示例(结合Next.js SSG)

下面是Next.js中用SSG预获取外部API数据,再传给SWR fallback的典型场景:

// pages/posts.js
import useSWR from 'swr';

const fetcher = (...args) => fetch(...args).then(res => res.json());

export default function Posts({ fallbackData }) {
  const { data, error } = useSWR(
    'https://jsonplaceholder.typicode.com/posts',
    fetcher,
    { fallback: { 'https://jsonplaceholder.typicode.com/posts': fallbackData } }
  );

  if (error) return <div>加载失败</div>;
  
  // 因为有fallback,data不会是undefined,直接渲染预获取的内容
  return (
    <div className="posts-list">
      {data.map(post => (
        <article key={post.id}>
          <h3>{post.title}</h3>
          <p>{post.body}</p>
        </article>
      ))}
    </div>
  );
}

// 构建时预获取外部API数据,作为fallback传入组件
export async function getStaticProps() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const fallbackData = await res.json();

  return { props: { fallbackData } };
}

这个示例里,用户打开页面会直接看到预渲染的文章内容,同时SWR在后台悄悄重新验证数据,有更新时自动刷新页面,兼顾了首屏速度和数据新鲜度。

三、fallback的适用场景

  • Next.js SSG/SSR预渲染:在构建或请求时预获取数据,让用户打开页面即有内容,同时用SWR保持数据实时性。
  • 避免加载态闪烁:用结构一致的初始数据替代骨架屏,比如默认用户名、占位文本,提升用户体验。
  • 离线备用数据:结合SWR的缓存机制,fallback可以作为离线时的展示内容,让无网络用户也能看到历史数据。

四、常见理解误区修正

  • 不要把fallback当成“永久默认值”:它只是临时初始数据,SWR默认会自动发起请求更新数据。
  • fallback的key必须完全匹配:比如/api/posts?page=1和/api/posts是两个不同的key,fallback要对应准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:15:32