ReactとNext.jsのデータ取得を1つのアプリで比較

Reactのデータ取得:サーバー、TanStack Query、SWR | We.Inc

短いクイズでReactのデータ取得方法を選び、サーバーコンポーネント、TanStack Query、SWRをキャッシュ、更新処理、デフォルト動作の観点から1つのサンプルアプリで比較します。

可能ならサーバーで取得しましょう。Next.jsのApp Routerでは、asyncのサーバーコンポーネントがHTMLを送る前にデータをawaitするため、ローディングスピナーのコードは不要です。ページを開いている間に変化するデータには、TanStack QueryやSWRなどのクライアントキャッシュを使います。これらはキャッシュ、リトライ、更新処理を扱ってくれます。単発のリクエストなら素のuseEffectでのfetchで十分です。

どの方法が合うか

このページのすべての例は、同じ小さなメモ一覧を読み込み、編集します。そのため、違いはデモではなく方法そのものから生まれます。下の3つの質問に答えると、最初のおすすめとそれに合ったスニペットが表示されます。

よくある質問

Next.jsのApp Routerではfetchリクエストはキャッシュされますか?

現在のNext.jsのドキュメントによると、fetchリクエストはデフォルトではキャッシュされず、完了するまでレンダリングをブロックします。1回のレンダリング内の同一リクエストはメモ化され、キャッシュはuse cacheディレクティブで有効にするか、Suspense内で最新データをストリーミングします。

TanStack Queryの重要なデフォルト設定は何ですか?

データはすぐにstaleになる(staleTimeは0)ため、マウント時、ウィンドウのフォーカス時、再接続時に再取得されます。使われていないクエリは5分間メモリに残り(gcTime)、失敗したクエリは指数バックオフで3回リトライされます。再取得が多すぎる場合はstaleTimeを大きくしましょう。

TanStack QueryとSWRのどちらを選ぶべきですか?

どちらもキーでキャッシュし、フォーカス時と再接続時に再検証します。TanStack Queryは更新処理、無効化、devtoolsの組み込み機能が豊富で、SWRはuseSWR(key, fetcher)を中心とした小さなAPIです。アプリごとにどちらか1つを選びましょう。両方使うとキャッシュが重複します。

サーバーコンポーネントがあってもクライアントライブラリは必要ですか?

ページの読み込みだけなら不要なことが多いです。ページ遷移なしでデータを更新する必要がある場合、ユーザーが編集して即座の反応を期待する場合、無限リストの場合には必要になります。多くのアプリはサーバーで読み込み、インタラクティブな画面でのみクライアントキャッシュを使います。

サーバー上でSupabaseのログインユーザーをどう確認すべきですか?

Supabaseのサーバーサイドガイドでは、サーバーコード内でgetSession()を信頼してはいけないとしています。トークンの署名を検証するsupabase.auth.getClaims()を呼び出してから、テーブルにクエリを実行します。行レベルセキュリティはすべてのクエリに引き続き適用されます。

まずサーバー、必要な場所にクライアントキャッシュを追加

待つ代わりにストリーミング

素のuseEffectパターンが不十分な理由

意外なデフォルト動作

初期状態での動作

サーバーでのウォーターフォールを避ける

両方のリクエストを開始してから、まとめてawaitする

awaitする前に両方の関数を呼び出すので、どちらも相手を待ちません。

遅い部分をSuspenseでストリーミング

見出しはすぐに送信され、メモ一覧はデータが届いた時点でストリーミングされます。

サーバーコンポーネントでのSupabase

ここでは、SupabaseのNext.jsサーバーサイドガイドにあるcreateClientヘルパー(lib/supabase/server.ts、@supabase/ssrベース)を使います。getClaims()がクエリ実行前にログインユーザーのトークンを検証します。

ログインユーザーのメモをサーバーで読み込む

notesテーブルの行レベルセキュリティが、どの行を返すかを決めます。

方法を選ぶ

サーバーコンポーネント(例:Next.jsのApp Router)を使っていますか?

ページを開いたままの間にデータを更新する必要がありますか?

ユーザーは画面上でこのデータを編集しますか?

はい

いいえ

スタート用スニペット

スニペットをコピー

asyncサーバーコンポーネントで読み込みましょう。クライアントキャッシュは、後でインタラクティブになる部分にだけ追加します。

TanStack Queryを使いましょう:読み取りにはuseQuery、書き込みにはuseMutation、変更後の更新にはinvalidateQueriesを使います。

SWRを使いましょう:useSWRはごくわずかなコードで、フォーカス時と再接続時に画面を最新に保ちます。

ここでは単一のuseEffectでのfetchで十分です。遅れて届いたレスポンスが新しい状態を上書きしないよう、ignoreフラグでクリーンアップしましょう。

おすすめ:{v}

サーバーコンポーネント

TanStack Query

SWR

useEffectとfetch

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る