0Pricing
React Academy · レッスン

キャッシュ、Stale Time、バックグラウンド再取得

staleTimeとgcTimeを設定し、サーバーからデータを再取得するタイミングを制御します。

「キャッシュ、Stale Time、バックグラウンド再取得」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、staleTime と gcTime を設定し、React Query がデータを fresh に保つ期間と、キャッシュされたデータをメモリに保持する期間を制御します。

Fresh なデータと Stale なデータ

React Query は、キャッシュされたデータが「fresh」か「stale」かを追跡します。Fresh なデータはネットワークリクエストなしですぐに返されます。Stale なデータもすぐに返されますが、更新のためにバックグラウンドで再取得が開始されます。

staleTime

staleTime は、データが fresh であり続ける期間をミリ秒単位で定義します。デフォルトは 0(すぐに stale になる)です。60000 に設定すると、直前の1分以内に取得されたデータはバックグラウンドで再取得せずに返されます。
useQuery({
  queryKey: ['users'],
  queryFn: fetchUsers,
  staleTime: 60_000, // fresh for 60 seconds
})

静的データに staleTime を設定する

ほとんど変化しないデータ(国の一覧や設定オプションなど)には、高い staleTime を設定します。リアルタイムデータ(株価など)ではデフォルトの 0 を維持し、ポーリングを有効にします。
// Effectively never stale — reload only on explicit invalidation
useQuery({ queryKey: ['countries'], queryFn: fetchCountries,
  staleTime: Infinity })

gcTime(ガベージコレクション)

gcTime(旧称 cacheTime)は、使用されていないキャッシュデータをガベージコレクションまでメモリに保持する期間を定義します。デフォルトは5分です。gcTime が経過した後でも、新しい subscriber がマウントされると React Query はすぐに再取得できます。
useQuery({
  queryKey: ['products'],
  queryFn: fetchProducts,
  gcTime: 10 * 60 * 1000, // keep in memory for 10 minutes
})

staleTime と gcTime

staleTime は再取得するタイミング(データの fresh さ)を制御します。gcTime はキャッシュデータをメモリから破棄するタイミングを制御します。一般的には staleTime <= gcTime という関係になります。

バックグラウンド再取得のインジケーター

React Query がバックグラウンドで再取得するときは、データがすでにキャッシュされているため `isLoading` が false でも `isFetching` は true になります。isFetching を使って控えめなスピナーを表示できます。
const { data, isLoading, isFetching } = useQuery({ /* ... */ });

return (
  <>
    {isLoading ? <Spinner /> : <DataView data={data} />}
    {isFetching && !isLoading && <RefreshIndicator />}
  </>
);

refetchOnWindowFocus

デフォルトでは、ユーザーがタブに戻ると React Query は stale なクエリを再取得します。更新頻度の低いデータでは、この動作を無効にできます。
useQuery({
  queryKey: ['settings'],
  queryFn: fetchSettings,
  refetchOnWindowFocus: false,
})

ポーリングのための refetchInterval

`refetchInterval` を設定すると、タイマーに従ってクエリを自動的にポーリングできます。リアルタイムデータのダッシュボードに便利です。
useQuery({
  queryKey: ['liveStats'],
  queryFn: fetchStats,
  refetchInterval: 5000, // every 5 seconds
})

Placeholder Data

`placeholderData` を使うと、再取得中に以前のデータを表示でき、レイアウトのずれを防げます。ページネーションでは keepPreviousData オプションを使うと簡単です。
import { keepPreviousData } from '@tanstack/react-query';

useQuery({
  queryKey: ['posts', page],
  queryFn: () => fetchPage(page),
  placeholderData: keepPreviousData,
})

確認問題

クエリで staleTime: Infinity を設定すると、どのような効果がありますか?

まとめ

staleTime は fresh さ、つまりデータがバックグラウンドで再取得されるまでの期間を制御します。gcTime はメモリ、つまり使用されていないデータをキャッシュに保持する期間を制御します。isFetching はバックグラウンドでの再取得を示します。スムーズなページネーションには placeholderData を使用します。

次に学ぶこと

次のレッスン:**Mutations with useMutation** — API にデータを送信し、成功時にクエリを無効化します。

よくある質問

「キャッシュ、Stale Time、バックグラウンド再取得」レッスンは無料ですか?

はい。「キャッシュ、Stale Time、バックグラウンド再取得」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「キャッシュ、Stale Time、バックグラウンド再取得」で何を学びますか?

staleTimeとgcTimeを設定し、サーバーからデータを再取得するタイミングを制御します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「キャッシュ、Stale Time、バックグラウンド再取得」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. React QueryとQueryClientのセットアップ
  2. キャッシュ、Stale Time、バックグラウンド再取得
  3. useMutationによるMutation
  4. useInfiniteQueryによる無限スクロールとページネーション
← React Academyに戻る