clerk-react-patterns
Clerk React 認証パターンライブラリ、Vite/CRA SPA 向けの完全な認証統合ソリューションとベストプラクティスを提供。
npx skills add clerk/skills --skill clerk-react-patternsBefore / After 効果比較
1 组ユーザー登録、ログイン、セッション管理、ルーティング保護を手動で実装する場合、セキュリティの脆弱性やエッジケースへの対応が必要で、開発期間は 3-5 日かかります。
Clerk の事前構築済み hooks とコンポーネントを使用し、認証フローを宣言的に構成することで、2 時間で本番環境レベルの統合が完了します。
clerk-react-patterns
React SPA Patterns
This skill covers @clerk/react for Vite/CRA SPAs. For Next.js use clerk-nextjs-patterns. For TanStack Start use clerk-tanstack-patterns.
What Do You Need?
Task Reference
useAuth / useUser / useClerk hooks references/hooks.md
Protected routes with React Router references/protected-routes.md
Custom sign-in / sign-up forms references/custom-flows.md
React Router v6/v7 integration references/router-integration.md
References
Reference Description
references/hooks.md
useAuth, isLoaded guard
references/protected-routes.md
ProtectedRoute pattern
references/custom-flows.md
useSignIn, useSignUp flows
references/router-integration.md
React Router v6/v7 setup
Setup
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>,
)
Mental Model
@clerk/react is client-only — there is no server-side auth(). All auth state comes from hooks.
-
isLoadedmust betruebefore trustingisSignedIn— always guard onisLoaded -
useClerk()gives access tosignOut,openSignIn,openUserProfileand other methods -
getToken()fromuseAuth()fetches the session JWT for API calls
Minimal Pattern
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>
}
Protected Route (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>
Token for API Calls
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>
}
Common Pitfalls
Symptom Cause Fix
isSignedIn is undefined
isLoaded is still false
Always check isLoaded first
ClerkProvider missing
Provider not at root
Wrap <App> in main.tsx
Env var undefined
Wrong Vite prefix
Use VITE_CLERK_PUBLISHABLE_KEY, access via import.meta.env
Token is null
User not signed in
Null-check getToken() result
Sign-in component shows blank
No publishableKey on provider
Pass publishableKey explicitly
See Also
-
clerk-setup- Initial Clerk install -
clerk-custom-ui- Custom flows & appearance -
clerk-orgs- B2B organizations
Docs
React SDK Weekly Installs514Repositoryclerk/skillsGitHub Stars34First Seen11 days agoSecurity AuditsGen Agent Trust HubPassSocketPassSnykPassInstalled oncodex442gemini-cli419cursor419github-copilot417cline411opencode407
ユーザーレビュー (0)
レビューを書く
レビューなし
統計データ
ユーザー評価
この Skill を評価