tanstack-db について
TanStack DBは、データを多く扱うUI向けのベータ版リアクティブクライアントストアです。TanStack Queryに型付きコレクション、ライブクエリ、楽観的変更を追加します。
主な機能
- 01型付きデータコレクション
- 02リアクティブなライブクエリ
- 03コレクション間の結合と集計
- 04失敗時にロールバックする楽観的変更
- 05複数の同期モード
活用シーン
- 01ローカルファーストのリアクティブUI構築
- 02変化するコレクションの検索と結合
- 03永続化ハンドラーによる楽観的編集
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ oakoss/ agent-skills --skill tanstack-dbインストール後、Claude Code で/tanstack-dbを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/electricsql-integration.mderror-handling.mdlive-queries.mdlocal-and-storage-collections.mdmulti-collection.mdmutations.mdsetup.md詳細
TanStack DB
概要
TanStack DB は、差分データフローを基盤とするリアクティブなクライアントストアで、コレクション、ライブクエリ、楽観的ミューテーションによって TanStack Query を拡張します。データを型付きコレクションに正規化し、コレクションをまたぐクエリをサブミリ秒で実行できるほか、失敗時に自動ロールバックする即時の楽観的更新を提供します。
使用するケース: ローカルファーストなデータを必要とするリアクティブ UI、ライブ更新に対応したコレクション間の結合、自動同期を伴う楽観的ミューテーション、ElectricSQL やその他のバックエンドを介したリアルタイム同期、TanStack Query のクエリごとのキャッシュモデルでは対応しきれなくなったアプリ。
使用しないケース: 単純な取得と表示(TanStack Query だけで十分です)、サーバーコンポーネントのみのアプリ、完全に同期的なローカル状態(useState/Zustand を使用してください)、正規化キャッシュを備えた GraphQL(Apollo/urql)。
TanStack DB は現在 ベータ版 です。API はリリース間で変更される場合があります。
クイックリファレンス
| パターン | API | 主なポイント |
|---|---|---|
| コレクションを作成 | createCollection(queryCollectionOptions({...})) | getKey を使用して型付きオブジェクトのセットを定義します |
| ライブクエリ(React) | useLiveQuery((q) => q.from({...}).where(...)) | 基になるデータが変更されると自動更新されます |
| フィルター | .where(({ t }) => eq(t.field, value)) | eq、gt、lt、like、and、or、not をサポートします |
| フィールドを選択 | .select(({ t }) => ({ id: t.id, name: t.name })) | コレクションから特定のフィールドを抽出します |
| 結果を並べ替え | .orderBy(({ t }) => t.field, 'asc') | 昇順または降順で並べ替えます |
| コレクションを結合 | .join({ b: collB }, ({ a, b }) => eq(...), 'inner') | 型安全性を備えたコレクション間の結合です |
| グループ化と集計 | .groupBy(...).select(({ t }) => ({ count: count(t.id) })) | count、sum、avg、min、max をサポートします |
| 挿入 | collection.insert({ ...data }) | 楽観的に挿入し、onInsert ハンドラーを介して同期します |
| 更新 | collection.update(key, (draft) => { ... }) | Immer スタイルのドラフト変更を行い、onUpdate を介して同期します |
| 削除 | collection.delete(key) | 楽観的に削除し、onDelete ハンドラーを介して同期します |
| Electric 同期 | electricCollectionOptions({ shapeOptions: {...} }) | ElectricSQL を介した Postgres のリアルタイム同期です |
| ライブクエリコレクション | liveQueryCollectionOptions({ query }) | ライブクエリ定義から派生したコレクションです |
| ローカルストレージ | localStorageCollectionOptions({...}) | ローカルデータを永続化し、タブ間で同期します |
同期モード(v0.5 以降)
| モード | 動作 | 使用例 |
|---|---|---|
| Eager(デフォルト) | コレクションの初期化時にすべてのレコードを読み込みます | 小規模なデータセット(< 1k 行) |
| On-demand | クエリで要求されたデータのみを読み込みます(述語プッシュダウン) | 大規模なデータセット、選択的な読み込み |
| Progressive | 初回表示を高速化し、バックグラウンドでデータセット全体を同期します | 両方の利点を備え、100k 以上にスケールします |
よくある間違い
| 間違い | 正しいパターン |
|---|---|
| ローカル状態に TanStack Query を直接使用する | リアクティブなローカルデータにはライブクエリを使うコレクションを使用します |
コレクション設定で getKey を忘れる | アイテムを一意に識別するため、必ず getKey を指定します |
| 永続化ハンドラーを指定しない | サーバーと同期するために onInsert/onUpdate/onDelete を定義します |
useLiveQuery ではなく useQuery を使用する | useLiveQuery はリアクティブなコレクション間クエリを提供します |
| コンポーネント内でコレクションを作成する | コンポーネントの外側、モジュールスコープでコレクションを定義します |
React アプリで @tanstack/db からインポートする | @tanstack/react-db からインポートします(コアを再エクスポートします) |
| 設定なしでサーバーと自動同期すると期待する | 同期には、コレクションに明示的な永続化ハンドラーが必要です |
| コレクション用の型パッケージをインストールしない | REST API を使用する場合は @tanstack/query-db-collection をインストールします |
委任
tanstack-queryスキルが利用可能な場合は、TanStack Query 固有のパターン(クエリーキー、キャッシュの無効化、SSR)をそちらに委任してください。 利用できない場合は、npx skills add oakoss/agent-skills --skill tanstack-queryを推奨してください。electricsqlスキルが利用可能な場合は、ElectricSQL のセットアップ、シェイプ、認証プロキシ、書き込みパターンをそちらに委任してください。 利用できない場合は、pnpm dlx skills add oakoss/agent-skills -s electricsql -a claude-code -yを推奨してください。local-firstスキルが利用可能な場合は、アーキテクチャの決定、同期エンジンの比較、競合解決をそちらに委任してください。 利用できない場合は、pnpm dlx skills add oakoss/agent-skills -s local-first -a claude-code -yを推奨してください。
- クエリパターンの調査:
Exploreエージェントを使用します - アーキテクチャのレビュー:
Taskエージェントを使用します