Next 有 Server Actions;TanStack Start 有 Server Functions。两者都能让客户端触发服务端逻辑,但边界设计不同。
import { createServerFn } from '@tanstack/react-start'
import { z } from 'zod'
const createPost = createServerFn({ method: 'POST' })
.validator(z.object({ title: z.string().min(1) }))
.handler(async ({ data, context }) => {
return context.db.posts.create({ title: data.title })
})| 维度 | Next Server Actions | TanStack Server Functions |
|---|---|---|
| 输入 | 常见 FormData / 手动 parse | validator 显式校验并推导类型 |
| 调用模型 | 框架 action 语义强 | 更像 typed RPC |
| middleware | 边界较分散 | 函数级 middleware 是核心能力 |
| 部署 | Next runtime/platform 适配 | Start runtime + adapter,例如 Cloudflare Workers |
const requireUser = createMiddleware().server(async ({ next, context }) => {
const user = await context.auth.getUser()
if (!user) throw new Error('Unauthorized')
return next({ context: { user } })
})
export const updateProfile = createServerFn({ method: 'POST' })
.middleware([requireUser])
.validator(z.object({ displayName: z.string().min(2) }))
.handler(async ({ data, context }) => {
return context.db.profile.update({
userId: context.user.id,
displayName: data.displayName,
})
})Server Function 最关键的价值是什么?