Slide 1

Slide 1 text

TanStack Routerに移行するのかい しないのかい、どっちなんだい! 株式会社カミナシ Shimmy(@naoya7076) TSKaigi Kansai 2024

Slide 2

Slide 2 text

TanStack Routerに 「Type Safe」に移行したい時に 考えること

Slide 3

Slide 3 text

ルーティングで行っていること 1.Path Params http://example.com/blogs/1 2.Search Params http://example.com/blogs?filter=hoge 3.State Value (of the location) URL間での内部状態の受け渡し カミナシ帳票の現在 TanStack Routerに 移行したい! ルーティング - React Router v6 データフェッチ - TanStack Query

Slide 4

Slide 4 text

データ受け渡しとTanStack RouterのAPI 1.Path Params - useParams const postId = useParams({ from: '/posts/$postId', select: (params) => params.postId, }) 2.Search Params - useSearch const selected = useSearch({ from: '/posts/$postId', select: (search) => search.postView, }) // ^ string

Slide 5

Slide 5 text

3.State Value (of the location) URL間での内部状態の受け渡しが 型安全ではない ※1 const navigate = useNavigate(); navigate( { to : '/user', state : { user : someUserData } } ); const location = useLocation(); const user = location.state.user; //Type Safeではない ※1https://github.com/TanStack/router/discussions/284

Slide 6

Slide 6 text

declare module '@tanstack/react-router' { interface Register { router: typeof router; } interface HistoryState { post?: { id: string; name: string }; } } const navigate = useNavigate(); navigate({ to: '/posts/$postId', params: { postId } state: {{ post: { id: '123'; name: 'foo' } }} }) 型をつけるには HistoryState を拡張する

Slide 7

Slide 7 text

課題 1. Globalな型定義が汚染-> ルーティング全体に影響する a. 関係ない箇所でも表示される b. Optionalにせざるを得ないので型定義の恩恵を受けづらい 2. 管理するstateを増やすとHistoryStateが肥大化

Slide 8

Slide 8 text

1.Search Paramsに寄せる TanStack Routerはin-memory stateで状態を持つのではなく Search Paramsに寄せようという思想がある※2 TanStack RouterのSearch Paramsではオブジェクトなども柔軟に扱える 3.State Value (of the location)の代替案 2.状態管理ライブラリを使う - Jotai - Zustand ※2

Slide 9

Slide 9 text

in-memory stateで内部的に扱いたい場合は...? 3.State受け渡しが型安全になるのを待つ -> 実装されそうな雰囲気ではあるが...※3 ※3

Slide 10

Slide 10 text

私: TanStack Router V2でルート間の型付 きstate渡しが導入されると嬉しいな※4 Tanner:We could totally do that. 実際に聞いてみた ※4 https://github.com/TanStack/router/discussions/975#discussioncomment-10413562

Slide 11

Slide 11 text

結論 State受け渡しが型安全になったら TanStack Routerに移行する (=typed state per routeが入ったら) そのためにできること - あらかじめV2に備えたコードにしておく※5 - 欲しい機能であれば+1する※6 - 自分で実装してPull Requestを出す ※5 https://github.com/TanStack/router/discussions/975 ※6 https://github.com/TanStack/router/discussions/284#dis cussioncomment-9344482

Slide 12

Slide 12 text

We are hiring!! 「カミナシ エンジニア」で検索