clerk-tanstack-patterns

作者: clerk

使用 @clerk/tanstack-react-start 的 TanStack React Start 认证模式

npx skills add https://github.com/clerk/skills --skill clerk-tanstack-patterns

TanStack React Start Patterns

What Do You Need?

TaskReference
Protect routes with beforeLoadreferences/router-guards.md
Auth in createServerFnreferences/server-functions.md
Pass auth to loadersreferences/loaders.md
Configure Vinxi + clerkMiddlewarereferences/vinxi-server.md

References

ReferenceDescription
references/router-guards.mdbeforeLoad auth redirect
references/server-functions.mdcreateServerFn with auth()
references/loaders.mdAuth context in loaders
references/vinxi-server.mdclerkMiddleware() setup

Setup

npm install @clerk/tanstack-react-start

.env:

CLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...

src/start.ts (Vinxi entry):

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 — wrap with <ClerkProvider>:

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:

  1. Server layer — createServerFn + auth() from @clerk/tanstack-react-start/server
  2. Router layer — beforeLoad on route definitions, throws redirect for unauthenticated

Both layers are server-executed. Client hooks (useAuth, useUser) are React hooks for the browser side.

Minimal Pattern

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

SymptomCauseFix
auth() returns emptyMissing clerkMiddleware in start.tsAdd to requestMiddleware array
redirect not thrownUsing return instead of throwthrow redirect(...) in TanStack
Wrong import for authMixing client/server importsServer: @clerk/tanstack-react-start/server
Loader context missing userIdNot passing from beforeLoadReturn from beforeLoad, access via context
ClerkProvider missingForgot root wrappingAdd to __root.tsx shell component

See Also

  • clerk-setup - Initial Clerk install
  • clerk-custom-ui - Custom flows & appearance
  • clerk-orgs - B2B organizations

Docs

TanStack React Start SDK

来自 clerk 的更多技能

mosaic
clerk
Work on Mosaic UI: styling a component with slot recipes (`defineSlotRecipe` / `useRecipe` / slots / variants), or building a flow — authoring a state machine…
clerk-billing
clerk
用于订阅管理的 Clerk Billing - 渲染 Clerk 的 PricingTable
clerk-nextjs-patterns
clerk
用于身份验证、中间件、服务器操作以及使用Clerk进行用户范围缓存的高级Next.js模式。区分服务器端await auth()与客户端useAuth()钩子;混合使用是常见的破坏性错误。涵盖中间件策略(公共优先与受保护优先)、API路由保护以及正确的HTTP状态码(401与403)。包括使用unstable_cache进行用户范围缓存模式以及保护服务器操作免受未授权修改。提供Core 2兼容性...
clerk-expo-patterns
clerk
使用 Clerk 的 Expo / React Native 模式 — SecureStore 令牌缓存、OAuth
changesets
clerk
Create or refresh a `.changeset/<slug>.md` for the current branch, or report that none is required. Triggers on "/changesets create", "add a changeset",…
clerk
clerk
clerk 二进制文件是通往 Clerk 后端 API 和平台 API 的预认证网关,同时提供项目级工具(认证、链接、环境变量拉取、实例配置)。当用户询问任何涉及 Clerk 资源的问题时,请优先使用 clerk,而不是手动编写 curl 命令。
clerk-cli
clerk
clerk 二进制文件是通往 Clerk 后端 API 和平台 API 的预认证网关,同时提供项目级工具(身份验证、链接、环境拉取、实例配置)。当用户询问任何涉及 Clerk 资源的问题时,请优先使用 clerk,而不是手动编写 curl 命令。
clerk-astro-patterns
clerk
使用 Clerk 的 Astro 模式——中间件、SSR 页面、岛屿组件