swr
SWR data-fetching expert guidance. Use when building React apps with client-side data fetching, caching, revalidation, mutations, optimistic UI, pagination, or infinite loading using the SWR library.
- License 许可
- MIT
- 最近更新
- 2026-03-30
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- swr
- chainTo
- [ { "message": "Direct AI provider SDK detected alongside SWR — loading AI SDK guidance for unified streaming and provider-agnostic patterns.", "pattern": "from\\s+['\\\"](openai|@anthropic-ai/sdk|anthropic)['\"]|new\\s+(OpenAI|Anthropic)\\(", "targetSkill": "ai-sdk" }, { "message": "@vercel/postgres and @vercel/kv are sunset — loading Vercel Storage guidance for Neon and Upstash migration.", "pattern": "from\\s+['\"\"]@vercel/(postgres|kv)['\"\"]", "targetSkill": "vercel-storage" }, { "message": "Manual useEffect+fetch pattern detected — SWR provides automatic caching, deduplication, revalidation, and error retry. Replace with useSWR for cleaner data fetching.", "pattern": "useEffect\\s*\\([^)]*\\)\\s*\\{[^}]*fetch\\s*\\(|useEffect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{[^}]*fetch\\s*\\(", "targetSkill": "swr" }, { "message": "Axios detected in React component — SWR with a native fetch wrapper provides caching, deduplication, and revalidation that axios alone cannot. Use useSWR with a fetcher function instead.", "pattern": "from\\s+['\\\"](axios)['\"]|require\\s*\\(\\s*['\\\"](axios)['\"]", "targetSkill": "swr" } ]
- metadata
- { "docs": [ "https://swr.vercel.app/docs" ], "sitemap": "https://swr.vercel.app/sitemap.xml", "priority": 4, "bashPatterns": [ "\\bnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b", "\\bpnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b", "\\bbun\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b", "\\byarn\\s+add\\s+[^\\n]*\\bswr\\b" ], "pathPatterns": [ "lib/fetcher.*", "src/lib/fetcher.*", "utils/fetcher.*", "src/utils/fetcher.*", "hooks/use*SWR*", "src/hooks/use*SWR*", "hooks/useFetch*", "src/hooks/useFetch*" ], "promptSignals": { "allOf": [ [ "data fetching", "client" ], [ "cache", "revalidat" ] ], "anyOf": [ "mutation", "optimistic", "infinite loading", "pagination" ], "noneOf": [], "phrases": [ "swr", "useswr", "stale-while-revalidate" ], "minScore": 6 }, "importPatterns": [ "swr", "swr/*" ] }
- retrieval
- { "aliases": [ "data fetching", "client cache", "stale while revalidate", "react hooks data" ], "intents": [ "refresh stale client cache after a mutation", "fetch and cache API data on the client side", "add infinite scroll or paginated data loading", "keep UI in sync with server data automatically", "revalidate cached data after updating a record" ], "entities": [ "useSWR", "useSWRMutation", "useSWRInfinite", "mutate", "SWRConfig", "fetcher" ], "examples": [ "refresh stale client cache after mutation", "load more items on scroll", "revalidate data when the window regains focus", "fetch data client side with caching", "add infinite scrolling to load more items" ] }
- description
- SWR data-fetching expert guidance. Use when building React apps with client-side data fetching, caching, revalidation, mutations, optimistic UI, pagination, or infinite loading using the SWR library.
03 SKILL.md 正文
SWR — React Hooks for Data Fetching
You are an expert in SWR v2 (latest: 2.4.1), the React Hooks library for data fetching by Vercel. SWR implements the stale-while-revalidate HTTP cache invalidation strategy — serve from cache first, then revalidate in the background.
Installation
npm install swr
Core API
useSWR
import useSWR from 'swr'
const fetcher = (url: string) => fetch(url).then(res => res.json())
function Profile() {
const { data, error, isLoading, mutate } = useSWR('/api/user', fetcher)
if (isLoading) return <div>Loading...</div>
if (error) return <div>Error loading data</div>
return <div>Hello, {data.name}</div>
}
Key parameters:
key— unique string, array, or function identifying the resource (often a URL)fetcher— async function that receives the key and returns dataoptions— optional config object
Return values: data, error, isLoading, isValidating, mutate
useSWRMutation — Remote Mutations
import useSWRMutation from 'swr/mutation'
async function updateUser(url: string, { arg }: { arg: { name: string } }) {
return fetch(url, { method: 'POST', body: JSON.stringify(arg) }).then(res => res.json())
}
function Profile() {
const { trigger, isMutating } = useSWRMutation('/api/user', updateUser)
return (
<button disabled={isMutating} onClick={() => trigger({ name: 'New Name' })}>
Update
</button>
)
}
useSWRInfinite — Pagination & Infinite Loading
import useSWRInfinite from 'swr/infinite'
const getKey = (pageIndex: number, previousPageData: any[]) => {
if (previousPageData && !previousPageData.length) return null
return `/api/items?page=${pageIndex}`
}
function Items() {
const { data, size, setSize, isLoading } = useSWRInfinite(getKey, fetcher)
const items = data ? data.flat() : []
return (
<>
{items.map(item => <div key={item.id}>{item.name}</div>)}
<button onClick={() => setSize(size + 1)}>Load More</button>
</>
)
}
Global Configuration
Wrap your app (or a subtree) with SWRConfig to set defaults:
import { SWRConfig } from 'swr'
function App() {
return (
<SWRConfig value={{
fetcher: (url: string) => fetch(url).then(res => res.json()),
revalidateOnFocus: false,
dedupingInterval: 5000,
}}>
<Dashboard />
</SWRConfig>
)
}
Revalidation Strategies
| Strategy | Option | Default |
|---|---|---|
| On window focus | revalidateOnFocus |
true |
| On network recovery | revalidateOnReconnect |
true |
| On mount if stale | revalidateIfStale |
true |
| Polling | refreshInterval |
0 (disabled) |
| Manual | Call mutate() |
— |
Optimistic Updates
const { trigger } = useSWRMutation('/api/user', updateUser, {
optimisticData: (current) => ({ ...current, name: 'New Name' }),
rollbackOnError: true,
populateCache: true,
revalidate: false,
})
Conditional Fetching
Pass null or a falsy key to skip fetching:
const { data } = useSWR(userId ? `/api/user/${userId}` : null, fetcher)
Error Retry
SWR retries on error by default with exponential backoff. Customize with:
useSWR(key, fetcher, {
onErrorRetry: (error, key, config, revalidate, { retryCount }) => {
if (error.status === 404) return // Don't retry on 404
if (retryCount >= 3) return // Max 3 retries
setTimeout(() => revalidate({ retryCount }), 5000)
},
})
useSWRSubscription — Real-Time Data Sources
Subscribe to real-time data (WebSockets, SSE, etc.) with automatic deduplication:
import useSWRSubscription from 'swr/subscription'
function LivePrice({ symbol }: { symbol: string }) {
const { data } = useSWRSubscription(
`wss://stream.example.com/${symbol}`,
(key, { next }) => {
const ws = new WebSocket(key)
ws.onmessage = (event) => next(null, JSON.parse(event.data))
ws.onerror = (event) => next(event)
return () => ws.close()
}
)
return <span>{data?.price}</span>
}
The subscribe function receives a next(error, data) callback and must return a cleanup function. Multiple components using the same key share a single subscription.
Key Rules
- Keys must be unique — two
useSWRcalls with the same key share cache and deduplicate requests - Fetcher is optional when set via
SWRConfig mutate(key)globally revalidates any hook matching that key- Array keys like
useSWR(['/api/user', id], fetcher)— the fetcher receives the full array - Never call hooks conditionally — use conditional keys (
null) instead
04 同仓库更多 Skills
workflow
Vercel Workflow DevKit (WDK) expert guidance. Use when building durable workflows, long-running tasks, API routes or agents that need pause/resume, retries, step-based execution, or crash-safe orchestration with Vercel Workflow.
verification
Full-story verification — infers what the user is building, then verifies the complete flow end-to-end: browser → API → data → response. Triggers on dev server start and 'why isn't this working' signals.
vercel-storage
Vercel storage expert guidance — Blob, Edge Config, and Marketplace storage (Neon Postgres, Upstash Redis). Use when choosing, configuring, or using data storage with Vercel applications.
vercel-services
Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.
vercel-sandbox
Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation.
vercel-queues
Vercel Queues guidance (public beta) — durable event streaming with topics, consumer groups, retries, and delayed delivery. $0.60/1M ops. Powers Workflow DevKit. Use when building async processing, fan-out patterns, or event-driven architectures.