Communitygithub.com

sakilanwar12/nextjs-typescript-skills

用于在Next.js App Router中获取数据时——涵盖RSC fetch、缓存、重新验证、Suspense流式传输、并行获取或路由处理程序。确保正确的缓存和水fall行为。

nextjs-typescript-skills 是什么?

该技能为在Next.js App Router环境中使用TypeScript进行数据获取提供了明确的规则和模式。它强调在服务器组件中使用async/await进行数据获取,避免使用useEffect处理初始数据,并解释了fetch()在App Router中的默认缓存行为(通过cache: 'no-store'或next: { revalidate }控制)。技能涵盖了并行请求(使用Promise.all)、通过Suspense和loading.tsx进行流式传输、以及使用next: { tags }和revalidateTag进行按需重新验证等关键模式。它还包括完整的代码示例,展示如何实现静态数据获取(ISR)、动态数据获取、并行请求、流式传输以及API路由中的按需重新验证。最后提供一个检查清单,帮助开发者确保其数据获取实现遵循最佳实践。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sakilanwar12/nextjs-typescript-skills/tree/HEAD/skills/nextjs-data-fetching

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Next.js 数据获取

规则

  1. 在服务器组件中使用 async/await 进行数据获取。不要使用 useEffect 处理初始数据。
  2. 在 App Router 中,fetch() 默认是缓存的,除非指定 { cache: 'no-store' } 或 next: { revalidate }。请明确你所期望的行为。
  3. 使用 Promise.all 并行化独立请求,仅在依赖时按顺序执行。
  4. 将较慢的片段包裹在 <Suspense fallback> + loading.tsx 中以实现流式传输。
  5. 使用 next: { tags: ['posts'] } + revalidateTag('posts') 进行按需失效。
  6. 客户端数据获取(SWR/React Query)仅用于交互式/筛选型 UI——不用于首次渲染。

模式

// 带重新验证的静态数据(ISR)
async function getPosts() {
  const res = await fetch('https://api.example.com/posts', {
    next: { revalidate: 60 },
  });
  if (!res.ok) throw new Error('获取文章失败');
  return res.json();
}

// 动态数据,永不缓存
async function getInbox(userId: string) {
  const res = await fetch(`https://api.example.com/inbox/${userId}`, {
    cache: 'no-store',
  });
  return res.json();
}

// 在服务器组件中并行请求
export default async function Dashboard() {
  const [user, posts] = await Promise.all([getUser(), getPosts()]);
  return <View user={user} posts={posts} />;
}

// 流式传输较慢的片段
import { Suspense } from 'react';
export default function Page() {
  return (
    <div>
      <FastHeader />
      <Suspense fallback={<CommentsSkeleton />}>
        <SlowComments />
      </Suspense>
    </div>
  );
}
// app/api/revalidate/route.ts — 按需重新验证
import { revalidateTag } from 'next/cache';
export async function POST(req: Request) {
  const { tag, secret } = await req.json();
  if (secret !== process.env.REVALIDATE_SECRET)
    return Response.json({ ok: false }, { status: 401 });
  revalidateTag(tag);
  return Response.json({ ok: true });
}

检查清单

  • 使用的是服务器组件 fetch,而不是 useEffect?
  • 缓存模式是否明确(revalidate、no-store 或 tags)?
  • 独立请求是否已并行化?
  • 是否为较慢部分设置了 Suspense 边界?
  • 是否处理了错误(throw → error.tsx,或优雅降级)?

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

相关技能