clerk-tanstack-patterns
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTanStack React Start Patterns
TanStack React Start 开发模式
What Do You Need?
你需要实现什么?
| Task | Reference |
|---|---|
| Protect routes with beforeLoad | references/router-guards.md |
| Auth in createServerFn | references/server-functions.md |
| Pass auth to loaders | references/loaders.md |
| Configure Vinxi + clerkMiddleware | references/vinxi-server.md |
| 任务 | 参考文档 |
|---|---|
| 使用beforeLoad保护路由 | references/router-guards.md |
| 在createServerFn中实现身份验证 | references/server-functions.md |
| 向加载器传递身份验证信息 | references/loaders.md |
| 配置Vinxi + clerkMiddleware | references/vinxi-server.md |
References
参考文档列表
| Reference | Description |
|---|---|
| beforeLoad auth redirect |
| createServerFn with auth() |
| Auth context in loaders |
| clerkMiddleware() setup |
| 参考文档 | 说明 |
|---|---|
| beforeLoad身份验证重定向逻辑 |
| 搭配auth()使用createServerFn |
| 加载器中的身份验证上下文 |
| clerkMiddleware()配置方法 |
Setup
安装配置
npm install @clerk/tanstack-react-start.envCLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...src/start.tstypescript
import { clerkMiddleware } from '@clerk/tanstack-react-start/server'
import { createStart } from '@tanstack/react-start'
export const startInstance = createStart(() => {
return {
requestMiddleware: [clerkMiddleware()],
}
})src/routes/__root.tsx<ClerkProvider>tsx
import { ClerkProvider } from '@clerk/tanstack-react-start'
function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<ClerkProvider>
{children}
</ClerkProvider>
</body>
</html>
)
}npm install @clerk/tanstack-react-start.envCLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...src/start.tstypescript
import { clerkMiddleware } from '@clerk/tanstack-react-start/server'
import { createStart } from '@tanstack/react-start'
export const startInstance = createStart(() => {
return {
requestMiddleware: [clerkMiddleware()],
}
})src/routes/__root.tsx<ClerkProvider>tsx
import { ClerkProvider } from '@clerk/tanstack-react-start'
function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<ClerkProvider>
{children}
</ClerkProvider>
</body>
</html>
)
}Mental Model
核心逻辑模型
TanStack Start runs on Vinxi. Auth flows through two layers:
- Server layer — +
createServerFnfromauth()@clerk/tanstack-react-start/server - Router layer — on route definitions, throws
beforeLoadfor unauthenticatedredirect
Both layers are server-executed. Client hooks (, ) are React hooks for the browser side.
useAuthuseUserTanStack Start运行在Vinxi之上,身份验证流程分为两层:
- 服务层 — 来自的
@clerk/tanstack-react-start/server+createServerFnauth() - 路由层 — 路由定义上的钩子,未认证用户会触发
beforeLoad重定向redirect
两层均在服务端执行。客户端钩子(、)是运行在浏览器端的React钩子。
useAuthuseUserMinimal Pattern
最简实现示例
typescript
import { createFileRoute, redirect } from '@tanstack/react-router'
import { createServerFn } from '@tanstack/react-start'
import { auth } from '@clerk/tanstack-react-start/server'
const authStateFn = createServerFn().handler(async () => {
const { isAuthenticated, userId } = await auth()
if (!isAuthenticated) {
throw redirect({ to: '/sign-in' })
}
return { userId }
})
export const Route = createFileRoute('/dashboard')({
beforeLoad: async () => await authStateFn(),
})typescript
import { createFileRoute, redirect } from '@tanstack/react-router'
import { createServerFn } from '@tanstack/react-start'
import { auth } from '@clerk/tanstack-react-start/server'
const authStateFn = createServerFn().handler(async () => {
const { isAuthenticated, userId } = await auth()
if (!isAuthenticated) {
throw redirect({ to: '/sign-in' })
}
return { userId }
})
export const Route = createFileRoute('/dashboard')({
beforeLoad: async () => await authStateFn(),
})Common Pitfalls
常见问题
| Symptom | Cause | Fix |
|---|---|---|
| Missing | Add to |
| Using | |
Wrong import for | Mixing client/server imports | Server: |
| Loader context missing userId | Not passing from beforeLoad | Return from beforeLoad, access via |
| Forgot root wrapping | Add to |
| 问题表现 | 原因 | 解决方法 |
|---|---|---|
| start.ts中缺少 | 将其添加到 |
| 使用了 | 在TanStack中使用 |
| 混淆了客户端/服务端导入路径 | 服务端导入路径为 |
| 加载器上下文缺少userId | 未从beforeLoad中传递参数 | 在beforeLoad中返回对应值,通过 |
缺少 | 忘记在根组件包裹Provider | 在 |
See Also
拓展阅读
- - Initial Clerk install
clerk-setup - - Custom flows & appearance
clerk-custom-ui - - B2B organizations
clerk-orgs
- - Clerk初始安装教程
clerk-setup - - 自定义流程与样式
clerk-custom-ui - - B2B组织管理功能
clerk-orgs