deckardger/tanstack-integration-best-practices

TanStack QueryとTanStack Router、TanStack Startを統合するためのベストプラクティス。フルスタックデータフロー、SSR、キャッシュ連携のパターンを提供します。

tanstack-integration-best-practices とは?

このスキルは、TanStack Query、TanStack Router、TanStack Startを組み合わせて、効率的で一貫性のあるフルスタックデータフローを実現するためのベストプラクティスを提供します。主に、サーバーサイドレンダリング(SSR)環境でのデータフェッチとキャッシュの連携に焦点を当てており、ルーターのローダー関数とクエリクライアントの統合方法や、Startのサーバー関数を活用したハイブリッドデータ取得パターンをカバーしています。これにより、開発者はクライアントとサーバー間で状態を同期し、重複したデータフェッチを回避し、ユーザーエクスペリエンスを最適化できます。主にTypeScriptを使用するフルスタックアプリケーション開発者を対象とし、TanStackエコシステムの最新機能を最大限に活用するための設計指針を示します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/deckardger/tanstack-agent-skills/tree/main/skills/tanstack-integration-best-practices

Installed? Explore more 生産性&コラボレーション skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

tanstack-integration-best-practices は何をしますか?

TanStack QueryとTanStack Router、TanStack Startを統合するためのベストプラクティス。フルスタックデータフロー、SSR、キャッシュ連携のパターンを提供します。

なぜこれが重要なのか

TanStack Queryはクライアントサイドのデータフェッチとキャッシュに優れていますが、TanStack RouterやTanStack Startと適切に統合しないと、データの重複取得やキャッシュの不整合が発生する可能性があります。このドキュメントは、それらをシームレスに連携させるためのパターンをまとめています。

主要な統合パターン

1. ルーターローダーでのデータプリフェッチ

TanStack Routerのローダー関数内でQueryClientを使用してデータをプリフェッチします。これにより、ルート遷移前にデータがサーバーサイドで準備され、SSR時にHTMLに埋め込まれます。

import { createFileRoute } from '@tanstack/react-router'
import { queryClient } from '../lib/query-client'
import { fetchPosts } from '../api/posts'

export const Route = createFileRoute('/posts')({
  loader: async () => {
    await queryClient.prefetchQuery({
      queryKey: ['posts'],
      queryFn: fetchPosts,
    })
  },
})

2. サーバー関数との統合

TanStack Startのserver$関数を使って、サーバーサイドでのみ実行されるデータ処理を定義し、その結果をQueryのキャッシュに統合します。

import { server$ } from '@tanstack/react-start'
import { queryClient } from '../lib/query-client'

const fetchServerData = server$('fetchData', async () => {
  const data = await db.query('SELECT * FROM items')
  return data
})

3. キャッシュの連携

QueryClientのキャッシュをルーターの状態と同期させることで、クライアントサイドのナビゲーション時にキャッシュされたデータを再利用し、無駄なAPIコールを削減します。

import { useQuery } from '@tanstack/react-query'
import { useRouter } from '@tanstack/react-router'

export function useSyncedData() {
  const router = useRouter()
  
  return useQuery({
    queryKey: ['synced-data', router.state.location.pathname],
    queryFn: async () => {
      const response = await fetch(`/api/data${router.state.location.search}`)
      return response.json()
    },
  })
}

推奨されるアーキテクチャ

  1. QueryClientの共有: ルーターとアプリケーション全体で同一のQueryClientインスタンスを使用します。
  2. ローダーでのプリフェッチ: ルートローダー内で必要なデータをプリフェッチします。
  3. ハイドレーション: SSR時には、サーバーサイドでクエリを解決し、それらをクライアントにハイドレートします。
  4. 楽観的更新: ミューテーションには楽観的更新パターンを使用し、ルーターの状態と整合性を保ちます。

トラブルシューティング

  • キャッシュが古い場合は、QueryClientのinvalidateQueriesメソッドを使用して更新をトリガーします。
  • ルート遷移時にデータが再取得されない場合は、ローダーのキーが適切に設定されているか確認してください。

参考リンク

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

関連スキル