React Server Functions(简称 RSF)是 React 19+与 React Server Components(RSC)架构深度集成的核心特性,通过**"use server"指令**标记的异步函数,让客户端组件能像调用本地函数一样安全地执行服务器端逻辑,彻底简化了前后端交互模式,是构建现代全栈 React 应用的关键工具。


一、核心定义与定位

1.1 什么是 React Server Functions?

  • 本质:通过"use server"指令标记的异步函数,仅在服务器执行,客户端通过 RPC(远程过程调用)方式调用
  • 分类
    • 当传递给表单action属性或从 action 内部调用时,称为Server Actions(服务器操作)
    • 其他场景下的通用服务器函数,统一称为Server Functions
  • 核心价值:消除手动编写 API 端点的繁琐,实现前后端逻辑无缝衔接,同时保证安全性与性能优化

1.2 与 Server Components 的关系(关键区别)

特性React Server FunctionsReact Server Components
本质可远程调用的服务器函数仅在服务器渲染的组件
执行时机按需调用(客户端触发)渲染时自动执行
标记方式'use server'指令默认(无需标记)
客户端交互支持(通过函数调用)不支持(无交互能力)
用途数据突变、表单处理、服务器计算数据获取、静态 UI 渲染
序列化函数引用可跨边界传递组件本身不可传递,仅传递渲染结果

核心联系:Server Functions 通常在 Server Components 中定义,再传递给 Client Components 使用,形成完整的前后端协作链路。


二、底层工作原理(Mermaid 可视化)

2.1 完整执行流程

修正语法后可正常渲染,问题是括号标签格式冲突,调整写法:

定义并导出

Server Component

Server Function
use server 标记

框架自动生成RPC引用

Client Component
use client 标记

用户交互触发函数调用

React自动发送POST请求

服务器执行函数逻辑
访问数据库/文件系统

返回序列化结果

客户端接收结果并更新UI

2.2 关键技术细节

  1. 函数序列化:React 不会传递函数本身,而是生成唯一标识符,客户端通过标识符发起请求
  2. 自动 RPC:框架自动处理网络请求、参数序列化、响应解析,开发者无需编写 fetch 代码
  3. 加密闭包:函数中的闭包变量会被加密传输,防止敏感信息泄露
  4. 批处理优化:React 19+会自动批处理多个 Server Function 调用,减少网络请求次数

三、基础用法与 API 详解

3.1 定义 Server Function(三种方式)

方式 1:在 Server Component 中内联定义
// Server Component(无'use server'标记)
import ClientButton from './ClientButton'

async function createPost(formData) {
  'use server' // 必须放在函数体第一行

  // 服务器端逻辑:访问数据库、验证权限等
  const title = formData.get('title')
  const content = formData.get('content')
  await db.posts.create({ title, content })

  return { success: true }
}

export default function NewPostPage() {
  return <ClientButton onCreatePost={createPost} />
}
方式 2:独立模块定义(推荐)
// actions.js(纯服务器模块)
'use server' // 模块级标记,所有导出函数均为Server Functions

export async function updateUser(userId, data) {
  // 服务器端逻辑
  await db.users.update(userId, data)
  return { updated: true }
}

export async function deleteComment(commentId) {
  // 服务器端逻辑
  await db.comments.delete(commentId)
  return { deleted: true }
}
方式 3:表单 action 直接使用(Server Actions)
// Client Component
'use client'
import { updateName } from './actions'

function ProfileEditor() {
  return (
    <form action={updateName}>
      <input type="text" name="name" />
      <button type="submit">更新名称</button>
    </form>
  )
}

3.2 核心 API 与钩子

useActionState:管理 Server Action 状态
'use client'
import { useActionState } from 'react'
import { submitForm } from './actions'

function Form() {
  // 初始状态、Server Function、持久化状态键
  const [state, formAction] = useActionState(
    submitForm,
    {
      message: '',
      errors: {},
    },
    'form-key'
  )

  return (
    <form action={formAction}>
      <input type="text" name="email" />
      {state.errors.email && <p>{state.errors.email}</p>}
      <button type="submit">提交</button>
      {state.message && <p>{state.message}</p>}
    </form>
  )
}
useFormStatus:获取表单提交状态
'use client'
import { useFormStatus } from 'react-dom'

function SubmitButton() {
  const { pending } = useFormStatus()

  return (
    <button type="submit" disabled={pending}>
      {pending ? '提交中...' : '提交'}
    </button>
  )
}

四、React 19+专属优化与特性

4.1 自动错误处理与重试

React 19+会自动捕获 Server Function 执行中的错误,并提供重试机制:

async function submitPayment(formData) {
  'use server'
  try {
    await paymentService.process(formData)
    return { success: true }
  } catch (error) {
    // 错误会自动传递给客户端
    return { success: false, error: error.message }
  }
}

4.2 与并发渲染深度集成

Server Functions 与 React 19 并发特性完美配合,自动在transition中处理异步操作:

'use client'
import { useTransition } from 'react'
import { fetchData } from './actions'

function DataDashboard() {
  const [isPending, startTransition] = useTransition()
  const [data, setData] = useState(null)

  const loadData = async () => {
    startTransition(async () => {
      // Server Function调用会自动在过渡中处理
      const result = await fetchData()
      setData(result)
    })
  }

  return (
    <div>
      <button onClick={loadData} disabled={isPending}>
        {isPending ? '加载中...' : '加载数据'}
      </button>
      {data && <DataView data={data} />}
    </div>
  )
}

4.3 流式响应与 Suspense 集成

React 19+支持 Server Functions 返回流式响应,配合 Suspense 实现渐进式 UI 更新:

// Server Function
async function fetchLargeDataset() {
  'use server'
  // 返回可读流
  return db.largeData.stream()
}

// Client Component
;('use client')
import { Suspense } from 'react'

function LargeDataView() {
  return (
    <Suspense fallback={<LoadingSpinner />}>
      <DataStreamer fetchData={fetchLargeDataset} />
    </Suspense>
  )
}

五、安全最佳实践

5.1 输入验证(必须)

async function createUser(formData) {
  'use server'
  // 服务器端严格验证
  const email = formData.get('email')
  const password = formData.get('password')

  if (!validateEmail(email)) {
    throw new Error('无效的邮箱格式')
  }
  if (password.length < 8) {
    throw new Error('密码必须至少8位')
  }

  await db.users.create({ email, password: hashPassword(password) })
}

5.2 权限控制

async function deletePost(postId, userId) {
  'use server'
  // 验证用户权限
  const post = await db.posts.findUnique({ where: { id: postId } })
  if (post.authorId !== userId) {
    throw new Error('无权删除此文章')
  }
  await db.posts.delete({ where: { id: postId } })
}

5.3 防 CSRF 攻击

React Server Functions 默认包含 CSRF 保护机制:

  • 自动生成并验证 CSRF 令牌
  • 限制请求来源(Host/Origin 验证)
  • 推荐使用表单提交(自动携带令牌)而非手动 fetch 调用

六、常见使用场景

6.1 表单处理(Server Actions)

// Server Component
import { saveContact } from './actions';
import ContactForm from './ContactForm';

export default function ContactPage() {
  return <ContactForm action={saveContact} />;
}

// Client Component
'use client';
export default function ContactForm({ action }) {
  return (
    <form action={action}>
      <input type="text" name="name" required />
      <input type="email" name="email" required />
      <textarea name="message" required></textarea>
      <button type="submit">发送</button>
    </form>
  );
}

6.2 数据突变(增删改)

// actions.js
'use server'
export async function addToCart(productId, quantity) {
  // 服务器端购物车逻辑
  const cart = await db.cart.findOrCreate({ userId: session.userId })
  await db.cartItem.upsert({
    where: { cartId_productId: { cartId: cart.id, productId } },
    update: { quantity: { increment: quantity } },
    create: { cartId: cart.id, productId, quantity },
  })
  return { success: true }
}

6.3 服务器计算(复杂逻辑)

// actions.js
'use server'
export async function calculateShipping(zipCode, items) {
  // 复杂计算逻辑,避免在客户端执行
  const location = await geocodeService.getLocation(zipCode)
  const weight = items.reduce(
    (sum, item) => sum + item.weight * item.quantity,
    0
  )
  const shippingCost = await shippingService.calculate(location, weight)
  return { shippingCost }
}

七、框架支持与实现差异

框架支持情况特殊实现
Next.js 14+✅ 完全支持App Router 原生集成,自动处理路由
Remix✅ 支持通过 loader/actions 实现类似功能
Gatsby⚠️ 部分支持需插件配合,主要用于数据预取
React Server✅ 原生支持官方实验性框架,完整 RSC 实现

八、总结:React Server Functions 的革命性意义

React Server Functions 是 React 全栈开发的里程碑式特性,它带来了三大核心变革:

  1. 开发模式革新:消除前后端边界,前端开发者可直接编写服务器逻辑,无需学习额外后端框架
  2. 性能提升:减少网络请求次数,自动批处理,流式响应,配合 Suspense 实现最优加载体验
  3. 安全性增强:敏感逻辑全部在服务器执行,内置 CSRF 保护,加密闭包,严格输入验证

核心建议

  • 新项目优先采用 RSC 架构+Server Functions,大幅提升开发效率
  • 现有项目逐步迁移,先从表单处理等简单场景入手
  • 始终遵循安全最佳实践,避免在客户端暴露敏感信息
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐