swr
Reactでデータ取得、キャッシュ、再検証を効率的に行うためのSWRライブラリを活用し、古いデータを表示しつつ最新データを自動更新することで、Reduxなしでも快適なデータ取得を実現するSkill。
📜 元の英語説明(参考)
Fetch, cache, and revalidate data in React with SWR — stale-while-revalidate data fetching library by Vercel. Use when someone asks to "fetch data in React", "SWR", "data fetching hook", "cache API calls", "stale-while- revalidate", "auto-refresh data", or "React data fetching without Redux". Covers data fetching, caching, revalidation, mutation, pagination, and optimistic updates.
🇯🇵 日本人クリエイター向け解説
Reactでデータ取得、キャッシュ、再検証を効率的に行うためのSWRライブラリを活用し、古いデータを表示しつつ最新データを自動更新することで、Reduxなしでも快適なデータ取得を実現するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o swr.zip https://jpskill.com/download/15445.zip && unzip -o swr.zip && rm swr.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15445.zip -OutFile "$d\swr.zip"; Expand-Archive "$d\swr.zip" -DestinationPath $d -Force; ri "$d\swr.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
swr.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
swrフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
SWR
概要
SWR (stale-while-revalidate) は React のデータ取得ライブラリです。キャッシュされたデータを即座に表示し、バックグラウンドで再検証を行います。Vercel によって構築されており、キャッシュ、重複排除、フォーカス/再接続時の再検証、ページネーション、および楽観的アップデートを処理します。単純なデータ取得においては TanStack Query よりもシンプルで、API サーフェスも小さくなっています。
どのような時に使うか
- React コンポーネントで API データを取得する場合
- バックグラウンドでの再検証による、瞬時のページロードが必要な場合
- 自動的にリフレッシュされるべきリアルタイムデータ
- ページネーションされたデータまたは無限スクロールデータ
- ほとんどのユースケースにおいて、TanStack Query のよりシンプルな代替手段
手順
セットアップ
npm install swr
基本的なデータ取得
// hooks/useUser.ts — ユーザーデータを取得してキャッシュする
import useSWR from "swr";
const fetcher = (url: string) => fetch(url).then((r) => r.json());
export function useUser(userId: string) {
const { data, error, isLoading, mutate } = useSWR(
`/api/users/${userId}`,
fetcher,
);
return {
user: data,
isLoading,
isError: error,
mutate, // 手動で再検証
};
}
// コンポーネントでの使用例
function UserProfile({ userId }) {
const { user, isLoading } = useUser(userId);
if (isLoading) return <div>Loading...</div>;
return <div>{user.name}</div>;
}
グローバル設定
// app/providers.tsx — グローバル SWR 設定
import { SWRConfig } from "swr";
const fetcher = async (url: string) => {
const res = await fetch(url);
if (!res.ok) throw new Error("API error");
return res.json();
};
export function Providers({ children }) {
return (
<SWRConfig
value={{
fetcher,
revalidateOnFocus: true, // タブがフォーカスを取り戻したときにリフレッシュ
revalidateOnReconnect: true, // インターネットが再接続されたときにリフレッシュ
dedupingInterval: 2000, // 2秒以内のリクエストを重複排除
errorRetryCount: 3,
}}
>
{children}
</SWRConfig>
);
}
ミューテーションと楽観的アップデート
// components/TodoList.tsx — 楽観的アップデート
import useSWR, { useSWRConfig } from "swr";
function TodoList() {
const { data: todos, mutate } = useSWR("/api/todos");
const addTodo = async (title: string) => {
const newTodo = { id: Date.now(), title, done: false };
// 楽観的アップデート — 即座に表示し、バックグラウンドで再検証
await mutate(
async () => {
await fetch("/api/todos", {
method: "POST",
body: JSON.stringify({ title }),
});
// 更新されたデータを返す (または SWR にリフェッチさせる)
},
{
optimisticData: [...(todos || []), newTodo],
rollbackOnError: true, // API が失敗した場合にロールバック
revalidate: true, // ミューテーション後にリフェッチ
}
);
};
}
ページネーション
// components/PostList.tsx — ページネーションされたデータ
import useSWR from "swr";
function PostList() {
const [page, setPage] = useState(1);
const { data, isLoading } = useSWR(`/api/posts?page=${page}&limit=20`);
return (
<div>
{data?.posts.map((post) => <PostCard key={post.id} post={post} />)}
<button onClick={() => setPage(page - 1)} disabled={page <= 1}>Previous</button>
<button onClick={() => setPage(page + 1)} disabled={!data?.hasMore}>Next</button>
</div>
);
}
無限ローディング
// components/InfiniteFeed.tsx — 無限スクロール
import useSWRInfinite from "swr/infinite";
function InfiniteFeed() {
const { data, size, setSize, isLoading } = useSWRInfinite(
(index) => `/api/feed?page=${index + 1}&limit=20`,
);
const posts = data?.flatMap((page) => page.posts) || [];
const hasMore = data?.[data.length - 1]?.hasMore;
return (
<div>
{posts.map((post) => <PostCard key={post.id} post={post} />)}
{hasMore && (
<button onClick={() => setSize(size + 1)} disabled={isLoading}>
Load More
</button>
)}
</div>
);
}
例
例 1: 自動更新されるデータを持つダッシュボード
ユーザープロンプト: 「ライブメトリクスを表示するダッシュボードを構築してください。5秒ごとにリフレッシュします。」
エージェントは refreshInterval: 5000 で SWR を使用し、マウント時にキャッシュされたデータを即座に表示し、ローディング/エラー状態を処理します。
例 2: 楽観的アップデートによる CRUD
ユーザープロンプト: 「追加/削除が瞬時に感じられる ToDo アプリを構築してください。」
エージェントは楽観的データ、エラー時のロールバック、および変更後の自動再検証を備えた SWR ミューテーションを使用します。
ガイドライン
- Key = キャッシュキー — 同じキー = コンポーネント間で同じキャッシュされたデータ
nullキーはフェッチをスキップ — 条件付きフェッチ:useSWR(userId ? /api/... : null)- フォーカス時の再検証 — ユーザーがタブに戻るとデータがリフレッシュされます
- 楽観的アップデート — 変更を即座に表示し、エラー時に元に戻します
- キャッシュアップデートのための
mutate— バインド (キーごと) またはグローバル - 無限スクロールのための
useSWRInfinite— ページを累積します - 重複排除 — 同じキーを使用する複数のコンポーネント = 1つのリクエスト
- エラー再試行が組み込み — 指数バックオフによる自動化
- TanStack Query より小さい — より単純なニーズに対応するより単純な API
- 任意の fetcher で動作 — fetch, axios, GraphQL クライアント
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
SWR
Overview
SWR (stale-while-revalidate) is a React data fetching library — show cached data instantly, then revalidate in the background. Built by Vercel, it handles caching, deduplication, revalidation on focus/reconnect, pagination, and optimistic updates. Simpler than TanStack Query for straightforward data fetching, with a smaller API surface.
When to Use
- Fetching API data in React components
- Need instant page loads with background revalidation
- Real-time data that should refresh automatically
- Paginated or infinite scroll data
- Simpler alternative to TanStack Query for most use cases
Instructions
Setup
npm install swr
Basic Data Fetching
// hooks/useUser.ts — Fetch and cache user data
import useSWR from "swr";
const fetcher = (url: string) => fetch(url).then((r) => r.json());
export function useUser(userId: string) {
const { data, error, isLoading, mutate } = useSWR(
`/api/users/${userId}`,
fetcher,
);
return {
user: data,
isLoading,
isError: error,
mutate, // Manually revalidate
};
}
// Usage in component
function UserProfile({ userId }) {
const { user, isLoading } = useUser(userId);
if (isLoading) return <div>Loading...</div>;
return <div>{user.name}</div>;
}
Global Configuration
// app/providers.tsx — Global SWR config
import { SWRConfig } from "swr";
const fetcher = async (url: string) => {
const res = await fetch(url);
if (!res.ok) throw new Error("API error");
return res.json();
};
export function Providers({ children }) {
return (
<SWRConfig
value={{
fetcher,
revalidateOnFocus: true, // Refresh when tab regains focus
revalidateOnReconnect: true, // Refresh when internet reconnects
dedupingInterval: 2000, // Dedupe requests within 2s
errorRetryCount: 3,
}}
>
{children}
</SWRConfig>
);
}
Mutation and Optimistic Updates
// components/TodoList.tsx — Optimistic updates
import useSWR, { useSWRConfig } from "swr";
function TodoList() {
const { data: todos, mutate } = useSWR("/api/todos");
const addTodo = async (title: string) => {
const newTodo = { id: Date.now(), title, done: false };
// Optimistic update — show immediately, revalidate in background
await mutate(
async () => {
await fetch("/api/todos", {
method: "POST",
body: JSON.stringify({ title }),
});
// Return updated data (or let SWR refetch)
},
{
optimisticData: [...(todos || []), newTodo],
rollbackOnError: true, // Revert if API fails
revalidate: true, // Refetch after mutation
}
);
};
}
Pagination
// components/PostList.tsx — Paginated data
import useSWR from "swr";
function PostList() {
const [page, setPage] = useState(1);
const { data, isLoading } = useSWR(`/api/posts?page=${page}&limit=20`);
return (
<div>
{data?.posts.map((post) => <PostCard key={post.id} post={post} />)}
<button onClick={() => setPage(page - 1)} disabled={page <= 1}>Previous</button>
<button onClick={() => setPage(page + 1)} disabled={!data?.hasMore}>Next</button>
</div>
);
}
Infinite Loading
// components/InfiniteFeed.tsx — Infinite scroll
import useSWRInfinite from "swr/infinite";
function InfiniteFeed() {
const { data, size, setSize, isLoading } = useSWRInfinite(
(index) => `/api/feed?page=${index + 1}&limit=20`,
);
const posts = data?.flatMap((page) => page.posts) || [];
const hasMore = data?.[data.length - 1]?.hasMore;
return (
<div>
{posts.map((post) => <PostCard key={post.id} post={post} />)}
{hasMore && (
<button onClick={() => setSize(size + 1)} disabled={isLoading}>
Load More
</button>
)}
</div>
);
}
Examples
Example 1: Dashboard with auto-refreshing data
User prompt: "Build a dashboard that shows live metrics — refresh every 5 seconds."
The agent will use SWR with refreshInterval: 5000, show cached data instantly on mount, and handle loading/error states.
Example 2: CRUD with optimistic updates
User prompt: "Build a todo app where adding/deleting feels instant."
The agent will use SWR mutations with optimistic data, rollback on error, and automatic revalidation after changes.
Guidelines
- Key = cache key — same key = same cached data across components
nullkey skips fetching — conditional fetching:useSWR(userId ? /api/... : null)- Revalidation on focus — data refreshes when user returns to tab
- Optimistic updates — show changes immediately, revert on error
mutatefor cache updates — bound (per-key) or globaluseSWRInfinitefor infinite scroll — accumulates pages- Deduplication — multiple components using same key = one request
- Error retry built-in — automatic with exponential backoff
- Smaller than TanStack Query — simpler API for simpler needs
- Works with any fetcher — fetch, axios, GraphQL clients