将tRPC添加到现有项目
1. Install
bun add @trpc/server @trpc/client @trpc/react-query @tanstack/react-query@latest zod client-only server-only
- 版本信息
"@tanstack/react-query": "^5.84.2",
"@trpc/client": "^11.4.4",
"@trpc/react-query": "^11.4.4",
"@trpc/server": "^11.4.4",
"zod": "^4.0.16",
"client-only": "^0.0.1",
"server-only": "^0.0.1",
2. Create a tRPC router
-
src/trpc/init.ts,使用 initTRPC()初始化 tRPC 后端
-
src/trpc/routers/_app.ts, 用于放置tRPC总路由(将所有小路由集合起来并导出)
-
src/app/api/trpc/[trpc]/route.ts,把HTTP请求(GET/POST)转交给 tRPC 的后端路由解析器,可以理解为 tRPC 的网关/适配器
3. Create a Query Client factory src/trpc/query-client.ts
- tRPC 的前端调用是基于
@tanstack/react-query的(它负责缓存、请求状态管理、重试等)
- QueryClient 就是 React Query 的 “全局数据管理器”
- 在next.js中,需要支持 数据的 “脱水(dehydrate)” 和 “水化(hydrate)”
- 脱水(dehydrate):序列化服务器端请求到的数据 → 注入到HTML里发给浏览器
- 水化(hydrate):浏览器接收数据后反序列化 → 恢复到 QueryClient 的缓存中
4. Create a tRPC client for Client Components src/trpc/client.tsx
- 这一步记得在
src/app/layout.tsx 挂载 TRPCProvider
...
import { TRPCProvider } from "@/trpc/clent";
...
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<ClerkProvider afterSignOutUrl='/'>
<html lang="en">
<body className={ inter.className }>
<TRPCProvider>
{children}
</TRPCProvider>
</body>
</html>
</ClerkProvider>
);
}
5. Create a tRPC caller for Server Components src/trpc/server.tsx
-
import 'server-only' 表示这个文件只能在服务端被调用
6. Using your API
- 使用
<ErrorBoundary> 处理错误状态,当前安装版本"react-error-boundary": "^6.0.0"
- 使用
<Suspense> 处理loading状态