Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TanStack DB ~状態管理の新しい考え方~
Search
じょうげん
August 22, 2025
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TanStack DB ~状態管理の新しい考え方~
じょうげん
August 22, 2025
More Decks by じょうげん
See All by じょうげん
値・型・名前空間の「三重定義」で Reactコンポーネントをより柔軟に設計する TypeScript コンパニオンオブジェクト活用術
bmthd
0
70
読みやすいコードとはなにか? 未来の自分とチームへの思いやり
bmthd
0
500
Yamada UIドキュメント v2紹介
bmthd
0
740
コールバックchildrenでロジックの見通しを改善する
bmthd
0
35
Formの複雑さに立ち向かう
bmthd
1
3.5k
Other Decks in Programming
See All in Programming
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
680
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
メールのエイリアス機能を履き違えない
isshinfunada
0
230
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
340
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
490
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
180
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
650
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
320
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Side Projects
sachag
455
43k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
The SEO Collaboration Effect
kristinabergwall1
1
520
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
380
A Modern Web Designer's Workflow
chriscoyier
698
190k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
Transcript
TanStack DB ~ 状態管理の新しい考え方~ じょうげん
TanStack Query - Server State Management TanStack Router - Type-Safe
Routing TanStack Table - Headless Table Building TanStack Form - Headless Form Building TanStack DB - Client-Side Database ← NEW! TanStack ファミリー
フロントエンドに 永続化層(DB) を設けてコンポーネントからクエリする クエリファーストなAPI React だけでなく Vue / Svelte /
Solid など多数のUI フレームワークをサポート TanStack DB とは?
Client Side Querying → データ取得の主導権をフロント側へ 設計思想
export const drawCalcCollection = createCollection( localStorageCollectionOptions({ storageKey: "tcg-tool-draw-calculations", id: "draw-calculations",
getKey: (item) => item.id, schema: drawCalcSchema }), ); Collection という単位でデータの永続化を定義 Zod やValibot などでランタイムバリデーションありの型定義可能 React での使い方の例
const { data } = useLiveQuery((q) => q .from({ calculations:
calculationsCollection }) .where(({ calculations }) => eq(calculations.id, calculationId)), ); Drizzle のようなSQL ライクなセレクター 型安全なクエリビルダー クエリで絞り込まれた箇所のみの部分的なSubscribe を実現
const CalculationItem = ({ calculationId }: { calculationId: string })
=> { const { data } = useLiveQuery((q) => q.from({ calculations: calculationsCollection }) .where(({ calculations }) => eq(calculations.id, calculationId)), ); const firstCalculation = data[0]; if (!firstCalculation) return <FallbackItem />; return ( <Card.Root> <Card.Header> {firstCalculation.name} </Card.Header> <Card.Body> {firstCalculation.result} </Card.Body> </Card.Root> ); } コンポーネントで使う
// 条件をあらかじめ指定 export const drawCalcHistoryCollection = createLiveQueryCollection((q) => q.from({ calculations:
drawCalcCollection }) .orderBy(({ calculations }) => calculations.updatedAt, "desc"), ); // 引数ありの動的なCollection export const createDrawCalcByGameCollection = (gameTemplate: string) => createLiveQueryCollection((q) => q.from({ calculations: drawCalcCollection }) .where(({ calculations }) => eq(calculations.gameTemplate, gameTemplate)) .orderBy(({ calculations }) => calculations.updatedAt, "desc"), ); 派生Collection も可能
TanStack DB 、なにが美味しい?
localStorage インメモリ REST API Electric SQL TrailBase Supabase, IndexedDB, DuckDB
Wasm などもAdapter を用意することで利用可能になる かも 永続化層を 自由に差し替え可能
フロントエンド中心のデータ設計 が可能 RLS (Row Level Security )を組み合わせれば都度問い合わせの必要なし 特定の データベースSaaS の実装に依存せずに済む
バックエンド実装が不要に?
Zustand / Jotai のような状態を → SQL ライクなクエリ + スキーマ に置き換え可能
単なる状態管理にとどまらず、データの保管にも利用できる 認知負荷を大幅に削減 できるかも! 状態管理のベストプラクティスを変える?
Claude Code と一緒に既存のアプリケ ーションをTanStack DB に載せ替えし てみた できたもの https://tcg-tool.pages.dev/ draw-calc-db
ソースコード見たい方向 け https://github.com/bmthd/ tcg-tool/pull/3/files おまけ
「フロントエンド中心のデータ設計」を加速させる存在 全てのServer State の抽象化層になりうる フロントエンドの状態管理だけでなくバックエンド設計にも影響を与える可能性 大 まとめ