实战

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 Vitest 单元测试实战:AI 辅助前端测试完全指南(2026)Claude Code 辅助 Vitest 单元测试完整实战:安装配置(globals/jsdom/coverage)、工具函数测试生成(正常/边界/异常三类)、Vue 组件测试(Props/emit/loading/error状态)、Pinia Store 测试(beforeEach重置/计算属性验证)、覆盖率报告生成,附批量生成/Jest迁移/async mock Prompt 模板。2026/3/30实战Claude Code Playwright E2E 测试实战:AI 辅助编写端到端测试完全指南(2026)Claude Code 辅助 Playwright E2E 测试完整指南:从用户故事直接生成 Page Object Model 测试、修复 Flaky Tests(硬等待→等待元素/API请求)、API Mock 联合测试、GitHub Actions 并行3分片CI加速,附截图生成测试/批量边界条件/Core Web Vitals 测试 Prompt 模板。2026/3/29实战Claude Code Playwright E2E 测试实战:AI 辅助编写端到端测试完全指南(2026)Claude Code 辅助 Playwright E2E 测试完整指南:从用户故事直接生成 Page Object Model 测试、修复 Flaky Tests(硬等待→等待元素/网络请求)、API Mock + E2E 联合测试、GitHub Actions CI/CD 并行分片(3 shard 加速)、截图视频上传,附从截图生成测试/边界条件批量生成/Core Web Vitals 测试 Prompt 模板。2026/3/29实战Claude Code Hooks 实战完全指南:自动格式化、危险命令拦截与 CI 集成(2026)Claude Code Hooks 完整实战教程:PreToolUse/PostToolUse/Stop 四种触发时机、配置文件写法(~/.claude/settings.json)、危险命令拦截脚本(exit 2 阻止机制)、AI 写完代码后自动 Black/Prettier/gofmt 格式化、任务完成推送 Bark 手机通知、文件变更日志记录、Hook 调试技巧与 Matcher 模式参考。2026/3/28