mcpField
C
clerk-react-patterns

clerk-react-patterns

github.com/midudev开发7.0k58 次安装1 周前更新
代码仓库

关于 clerk-react-patterns

clerk-react-patterns 是面向使用 Vite 或 CRA 构建 React 单页应用的 Clerk 集成技能。它提供认证 Hook、受保护路由、自定义登录注册流程及 React Router 配置指引。

主要功能

  1. 01指导使用认证与用户 Hook
  2. 02提供 React Router 受保护路由模式
  3. 03说明自定义登录与注册流程
  4. 04指导获取会话 JWT
  5. 05涵盖加载状态与配置常见问题

适用场景

  1. 01为 React 单页应用加入 Clerk 认证
  2. 02按登录状态限制路由访问
  3. 03获取会话令牌并调用 API
  4. 04排查 Provider 或环境变量配置问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/midudev/autoskills --skill clerk-react-patterns

安装后在 Claude Code 中输入/clerk-react-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
custom-flows.md
hooks.md
protected-routes.md
router-integration.md
templates/react-basic-auth/
index.html
package.json
tsconfig.json
vite.config.ts
templates/react-basic-auth/src/
App.tsx
main.tsx

详细介绍

React SPA 模式

此技能适用于 Vite/CRA SPA 中的 @clerk/react。Next.js 请使用 clerk-nextjs-patterns。TanStack Start 请使用 clerk-tanstack-patterns。

你需要什么?

任务参考
useAuth / useUser / useClerk 钩子references/hooks.md
使用 React Router 的受保护路由references/protected-routes.md
自定义登录 / 注册表单references/custom-flows.md
React Router v6/v7 集成references/router-integration.md

参考

参考描述
references/hooks.mduseAuth、isLoaded 守卫
references/protected-routes.mdProtectedRoute 模式
references/custom-flows.mduseSignIn、useSignUp 流程
references/router-integration.mdReact Router v6/v7 设置

设置

npm install @clerk/react

.env:

VITE_CLERK_PUBLISHABLE_KEY=pk_...

src/main.tsx:

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ClerkProvider } from '@clerk/react'
import App from './App.tsx'

const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <ClerkProvider publishableKey={PUBLISHABLE_KEY}>
      <App />
    </ClerkProvider>
  </StrictMode>,
)

心智模型

@clerk/react 仅在客户端运行——没有服务端的 auth()。所有身份验证状态都来自钩子。

  • 在信任 isSignedIn 之前,isLoaded 必须为 true——始终先检查 isLoaded
  • useClerk() 可用于访问 signOut、openSignIn、openUserProfile 等方法
  • useAuth() 中的 getToken() 会获取用于 API 调用的会话 JWT

最简模式

import { useAuth } from '@clerk/react'

export function Dashboard() {
  const { isLoaded, isSignedIn, userId } = useAuth()

  if (!isLoaded) return <div>Loading...</div>
  if (!isSignedIn) return <div>Please sign in</div>

  return <div>Hello {userId}</div>
}

受保护路由(React Router v6/v7)

import { Navigate, Outlet } from 'react-router-dom'
import { useAuth } from '@clerk/react'

export function ProtectedRoute() {
  const { isLoaded, isSignedIn } = useAuth()

  if (!isLoaded) return <div>Loading...</div>
  if (!isSignedIn) return <Navigate to="/sign-in" replace />

  return <Outlet />
}
<Routes>
  <Route element={<ProtectedRoute />}>
    <Route path="/dashboard" element={<Dashboard />} />
    <Route path="/settings" element={<Settings />} />
  </Route>
  <Route path="/sign-in" element={<SignIn />} />
</Routes>

用于 API 调用的令牌

import { useAuth } from '@clerk/react'

export function DataFetcher() {
  const { getToken } = useAuth()

  async function fetchData() {
    const token = await getToken()
    if (!token) return

    const res = await fetch('/api/data', {
      headers: { Authorization: `Bearer ${token}` },
    })
    return res.json()
  }

  return <button onClick={fetchData}>Load</button>
}

常见问题

症状原因解决方法
isSignedIn 为 undefinedisLoaded 仍为 false始终先检查 isLoaded
缺少 ClerkProviderProvider 未位于根节点在 main.tsx 中用 <App> 包裹
环境变量未定义Vite 前缀错误使用 VITE_CLERK_PUBLISHABLE_KEY,通过 import.meta.env 访问
令牌为 null用户未登录对 getToken() 的结果进行空值检查
登录组件显示空白Provider 上没有 publishableKey显式传入 publishableKey

另请参阅

  • clerk-setup - Clerk 初始安装
  • clerk-custom-ui - 自定义流程和外观
  • clerk-orgs - B2B 组织

文档

React SDK

评论

支持 Markdown