实战

Claude Code React Server Components 实战:Next.js 15 RSC 开发完全指南(2026)

Claude Code 辅助 React Server Components(RSC)开发完整指南:服务端 vs 客户端组件选择原则、服务端直连数据库的页面写法、客户端交互组件 + Server Action 乐观更新、Suspense 流式渲染(主内容快速显示+慢数据不阻塞)、三类常见 RSC 错误诊断(useState/Event Handlers/Hydration),适配 Next.js 15。

2026/3/305分钟 阅读ClaudeEagle

React Server Components(RSC)是 React 和 Next.js 的重大架构变革—— 服务端直接渲染组件,无需客户端 JavaScript。 Claude Code 能帮你理解 RSC 的心智模型,生成正确的服务端/客户端组件代码。

RSC 核心心智模型

传统 React(纯客户端): 所有组件 → 发送 JS 到浏览器 → 浏览器执行渲染 React Server Components(RSC): 服务端组件 → 服务器执行渲染 → 发送 HTML(无 JS) 客户端组件 → 仍然发送 JS → 浏览器执行 好处: 减少客户端 JS 体积(大型依赖不发到浏览器) 直接访问数据库/文件系统(在服务器上) 更快的首屏渲染(HTML 直接返回)

服务端 vs 客户端组件选择

让 Claude Code 帮你判断:

Prompt: 这些组件应该是服务端还是客户端组件? 帮我用注释标注并解释原因: [粘贴组件列表]

Claude Code 的判断原则(会解释给你):

typescript
// 服务端组件(默认,不加 'use client'):
// ✅ 直接读数据库
// ✅ 访问文件系统
// ✅ 使用 API secrets(不暴露给客户端)
// ✅ 大型依赖(只在服务器执行,不发到浏览器)
// ❌ 不能用 useState/useEffect
// ❌ 不能有事件处理(onClick 等)

// 客户端组件(需要 'use client' 指令):
// ✅ 需要 useState/useEffect/useRef
// ✅ 需要事件处理(onClick/onChange)
// ✅ 需要浏览器 API(window/localStorage)
// ✅ 需要实时更新的 UI

场景一:数据获取页面(Server Component)

Prompt:

帮我写一个 Next.js 15 的博客文章列表页面, 直接在服务端从数据库获取数据, 支持分页和搜索(URL 参数), 不要用 useEffect 或 SWR。

Claude Code 生成:

typescript
// app/blog/page.tsx(服务端组件,默认)
import { db } from '@/lib/db'

interface PageProps {
  searchParams: Promise<{ page?: string; q?: string }>
}

export default async function BlogPage({ searchParams }: PageProps) {
  const { page = '1', q = '' } = await searchParams
  const pageNum = parseInt(page)
  const pageSize = 10

  // 直接在服务端查数据库(不需要 API 路由)
  const { articles, total } = await db.article.findMany({
    where: q ? { title: { contains: q } } : {},
    skip: (pageNum - 1) * pageSize,
    take: pageSize,
    orderBy: { createdAt: 'desc' }
  })

  return (
    <div>
      <SearchForm defaultValue={q} />  {/* 客户端组件 */}
      <ArticleList articles={articles} />  {/* 可以是服务端组件 */}
      <Pagination
        current={pageNum}
        total={Math.ceil(total / pageSize)}
      />
    </div>
  )
}

// 生成静态参数(可选,用于 SSG)
export async function generateMetadata({ searchParams }: PageProps) {
  const { q } = await searchParams
  return {
    title: q ? `搜索"${q}" - 博客` : '博客文章列表'
  }
}

场景二:交互组件(Client Component)

Prompt:

帮我写一个点赞按钮组件, 点击时调用 Server Action 更新数据库, 显示实时点赞数(乐观更新)。 要区分服务端和客户端部分。
typescript
// components/LikeButton.tsx
'use client'  // 需要交互,必须是客户端组件

import { useState, useTransition } from 'react'
import { toggleLike } from '@/actions/like'  // Server Action

interface LikeButtonProps {
  articleId: string
  initialLikes: number
  initialLiked: boolean
}

export function LikeButton({ articleId, initialLikes, initialLiked }: LikeButtonProps) {
  const [likes, setLikes] = useState(initialLikes)
  const [liked, setLiked] = useState(initialLiked)
  const [isPending, startTransition] = useTransition()

  function handleClick() {
    // 乐观更新:立即更新 UI
    setLiked(!liked)
    setLikes(prev => liked ? prev - 1 : prev + 1)

    // 后台同步到服务器
    startTransition(async () => {
      const result = await toggleLike(articleId)
      if (!result.success) {
        // 回滚乐观更新
        setLiked(liked)
        setLikes(initialLikes)
      }
    })
  }

  return (
    <button
      onClick={handleClick}
      disabled={isPending}
      className={liked ? 'text-red-500' : 'text-gray-400'}
    >
      {liked ? '❤️' : '🤍'} {likes}
    </button>
  )
}

// actions/like.ts(Server Action)
'use server'
import { db } from '@/lib/db'
import { auth } from '@/lib/auth'

export async function toggleLike(articleId: string) {
  const session = await auth()
  if (!session) return { success: false, error: 'Unauthorized' }

  // 直接操作数据库(在服务器上执行)
  const existing = await db.like.findUnique({
    where: { userId_articleId: { userId: session.user.id, articleId } }
  })

  if (existing) {
    await db.like.delete({ where: { id: existing.id } })
  } else {
    await db.like.create({ data: { userId: session.user.id, articleId } })
  }

  return { success: true }
}

场景三:Streaming(流式渲染)

Prompt:

帮我实现一个页面,主要内容快速加载, 慢速数据(如推荐列表,需要 AI 计算)用 Suspense 流式加载, 不阻塞整个页面的展示。
typescript
// app/article/[id]/page.tsx
import { Suspense } from 'react'
import { ArticleContent } from './ArticleContent'
import { RecommendedArticles } from './RecommendedArticles'

export default function ArticlePage({ params }: { params: { id: string } }) {
  return (
    <div>
      {/* 主内容:快速加载 */}
      <ArticleContent id={params.id} />

      {/* 推荐内容:异步加载,不阻塞主内容 */}
      <Suspense fallback={<RecommendSkeleton />}>
        <RecommendedArticles articleId={params.id} />
      </Suspense>
    </div>
  )
}

// RecommendedArticles.tsx(服务端组件,支持异步)
async function RecommendedArticles({ articleId }: { articleId: string }) {
  // 慢速 AI 推荐计算,不影响主内容渲染
  const recommendations = await getAIRecommendations(articleId)  // 可能 2-3 秒
  return <ArticleList articles={recommendations} />
}

常见 RSC 错误排查

Claude Code 能快速诊断这类错误:

错误1: "You're importing a component that needs useState. It only works in a Client Component." → 解决:在组件文件顶部添加 'use client' 错误2: "Event handlers cannot be passed to Client Component props." → 解决:不要从服务端组件传递函数给客户端组件 改为在客户端组件内定义 handler 错误3: Hydration failed because the server rendered HTML didn't match → 解决:检查是否在服务端使用了浏览器API(window/Date.now()) 用 useEffect 或 suppressHydrationWarning 处理

来源:Next.js 官方文档 + React 官方文档

相关文章推荐

实战Claude Code 写 React 组件:从需求描述到单元测试的完整工作流Claude Code 开发 React 组件完整工作流:需求转组件设计、TypeScript Props 定义、Hooks 实现、Tailwind 样式、React Testing Library 测试、Storybook 文档,以及复杂组件(表格/表单/弹窗)的高效开发模式。2026/3/15实战Claude Code + Tailwind CSS:10 分钟从零搭建现代 UI 组件库用 Claude Code 快速构建 Tailwind CSS UI 组件完整教程:响应式布局、组件库生成、深色模式、动画效果、与 React/Vue 集成,以及通过对话式迭代快速调整设计稿的工作流。2026/3/15实战Claude Code 跨会话协作实战:用 SendMessage 和 ListAgents 串联你的多台设备解析 Claude Code v2.1.224 新增的跨会话消息能力,探讨 SendMessage/ListAgents 的实战用法、crossSessionInbound 安全边界与多设备协作的应用潜力。2026/8/7实战Claude Code 长会话优化实战:让 CLAUDE.md 规则在 Compaction 后依然存活实战教学:基于官方 Compaction 存活规则表,指导你如何重新组织 CLAUDE.md 规则、调整 SKILL.md 写作顺序、合理使用 /compact focus 和 /clear,确保关键约定在长会话压缩后仍然存活,附完整检查清单。2026/7/12实战Claude Code Agent Teams 实战:三视角协作设计一个 CLI 工具基于官方文档实例,实战演示如何启用 Claude Code Agent Teams 并用三个视角(UX、技术架构、唱反调)协作探索一个 CLI 工具的设计方案,详解空闲行显示逻辑、折叠交互、In-process 与 Split panes 两种显示模式的适用场景。2026/7/12实战Claude Code 实战:Desktop 内置浏览器 + Auto Mode 组合,从查文档到自动提交 PR通过一个真实集成第三方 API 的完整场景,演示 Claude Code Desktop 内置浏览器与 Auto Mode 组合使用如何实现从查阅官方文档、编写集成代码、本地预览验证到提交推送创建 PR 的端到端自动化,并梳理背后的多层安全边界设计。2026/7/11