Upgrade to Pro — share decks privately, control downloads, hide ads and more …

大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~

大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~

株式会社WinTicketにおけるReduxからTanStack Queryへのリアーキテクチャ事例の紹介です。

Ibuki Kaji

April 18, 2024
Tweet

More Decks by Ibuki Kaji

Other Decks in Programming

Transcript

  1. 鍛 冶 維 吹 - k a j i ,

    i b u k i e 2022年 株式会社サイバーエージェント新卒入B e 株式会社 WinTicket 所a e ~2024/03:web フロンW e 2024/04~:バックエンF e 「筋トレは歯磨き」 自己紹介 @kj4555 @kj455
  2. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  3. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  4. WINTICKET について E 公営競技ネット投票サービ' E 競輪/オートレー' E 2019年4月リリー' E 市場シェアNo.1

    #React #Fastly #Go #Kubernetes #Flutter #Cloud Run #Google Cloud #TypeScript #TanStack Query
  5. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  6. TanStack Query への移行背景 WINTICKET Web の旧状態管理アーキテクチャ 3種類[1]のうち2種類の管理を Redux が担っていた [1]

    Zenn. “「3種類」で管理するReactのState戦略”. https://zenn.dev/knowledgework/articles/607ec0c9b0408d 2024/04/14 サーバーレスポンスのキャッシュ 管理場所 ステート種類 Redux Redux コンポーネント グローバルステート管理 ローカルステート ローカルステート
  7. TanStack Query への移行背景 Redux の辛み 「サーバーデータのキャッシュ」用途では面倒なポイントが多p g 非同期処理を扱うにはプラグインが必W g Redux

    Thunk (or Redux Saga6 g サーバーからのデータ取得に特化したものではない → 自前で色々と書く必要がある
  8. TanStack Query への移行背景 TanStack Query の導入 サーバーレスポンスのキャッシュ Before ステート種類 Redux

    Redux TanStack Query Redux コンポーネント コンポーネント After グローバルステート管理 ローカルステート ローカルステート
  9. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  10. 移行結果 移行を経て得られた定性的なメリット 10 データフローが簡潔に 70 レポジトリオーナーシップ向上[2] m クエリの呼び出しだけでデータを取得可… m データの正規化を廃‚

    m 将来 TanStack Query を剥がすことになっても 比較的楽にマイグレーション可能 m アプリケーション基盤への理Ž m 様々なドメインのコードの読み書v m レビューによる知見の共有 [2]. Speaker Deck. 「リアーキテクトと開発生産性について」. https://speakerdeck.com/yosuke_furukawa/riakitekutotokai-fa-sheng-chan-xing-nituite. 2024-04-14
  11. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  12. アーキテクチャ紹介 1. Query ファクトリ関数 ① ② TanStack Query V5 で導入された

    queryOptions API と同じ思想 .options():クエリオプションの生ƒ ym クエリ引数の queryKey への自動反• €m queryKey, queryFn の一括管理
  13. アーキテクチャ紹介 1. Query ファクトリ関数 ① ② TanStack Query V5 で導入された

    queryOptions API と同じ思想 実は一点危ないポイントが...! .options():クエリオプションの生— “{ クエリ引数の queryKey への自動反m ”{ queryKey, queryFn の一括管理
  14. アーキテクチャ紹介 QueryOptions 生成関数引数の型の厳格化 S オプション生成時の引数は
 そのまま queryKey に格納されQ S TanStack

    Query は
 queryKey が異なると別クエリとして扱う 引数オブジェクトが余剰プロパティを含む = クエリが別物として扱われる
  15. アーキテクチャ紹介 2. DI 層としての QueryFunctionContext QueryFunctionContextG B metc B queryKeV

    B signa5 B pageParam ←任意の値を入れられる Query の defaultOptions で meta に依存を注入可能
  16. アーキテクチャ紹介 2. DI 層としての QueryFunctionContext t QueryClient 生成時の defaultOptions で


    meta に依存を注h t テスト時はモックに差し替える →この方針には一点だけ問題がある...
  17. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  18. 移行を通じての学び メンバー全員の理解/同意を得る t– アーキテクチャ自体への納得感 「 良い設計をする‰ e Docsを読み漁q e ベストプラクティスを知q

    e 作者の X をフォローすq e 作者のブログを読4 e アプリケーション要件に応じてカスタマイズする ‡– 移行リードへの信頼感 「 徹底的なコミット‰ e メンバーからどんな質問が来ても自分の意見で答 えられる状態にすq e 何か起きても自責でどうにかする
  19. 01 WINTICKET について 02 TanStack Query への移行背景 03 移行結果 04

    アーキテクチャ紹介 05 移行を通じての学び 06 終わりに 目次
  20. 終わりに 思い残していること V TanStack Query V5 にアップデートできていなd V そもそも React

    18 にあげないと..# V Server Component 全盛時代が来たら TanStack Query も要らなくなる?
  21. 終わりに We are HIRING !!! ˆ WINTICKET Web で働いてくれる人を募集していますW ˆ

    圧倒的若手チーム(全員20代3 ˆ Web っぽいことだけに閉じずに CI/CD やインフラ周りを触る機会もアリ