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

マイグレーションコード自作して File-Based Routing に自動移行!! ~250...

マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~

WinTicket Webチームは、ユーザーが操作するアプリケーションだけでなく、社員が操作する管理画面の開発も行っています。 管理画面では、各社員の権限を基に、適切な画面の閲覧権と操作権を管理しています。 しかし、経年劣化・歴史的経緯による権限管理処理の複雑さや、コードベースのルーティング管理の煩雑さが課題となっていました。 今回はマイグレーションコードを自作して、250 ページにわたる画面を React Router から TanStack Router に全て置き換えた背景や手法をお話します。

CyberAgent

August 29, 2024
Tweet

More Decks by CyberAgent

Other Decks in Technology

Transcript

  1. 加藤 零 - kato, rei U 2023年 株式会社サイバーエージェント新卒入C U 株式会社

    WinTicket 所 U # Web Speed Hackathon 2024 作問者 自己紹介 @cut0_ @cut0
  2. % 公営競技ネット投票サービ % 競輪/オートレー % 2019年4月リリー % 市場シェアNo.1 #React #Fastly

    #Go #Kubernetes #Flutter #Cloud Run #Google Cloud #TypeScript #TanStack Query WINTICKET について
  3. WINTICKET Web チームについて G チームメンバー 5 h G サービス本体の開発 +

    Web に関連する社内ツールの開W G WINTICKE` G 管理画# G ダッシュボー G その他内製ツール
  4. WINTICKET Web チームについて $ チームメンバー 5 E $ $ WINTICKE3

    $ $ ダッシュボー# $ その他内製ツール サービス本体の開発 + Web に関連する社内ツールの開a 管理画I →今回話す対象
  5. TanStack Router 移行背景 ‚ 管理面はクラシックな SPA で構成されていて SSR を行っていなd ‚

    GCS に HTML + JS + CSS をホスティングするシンプルな構` ‚ ルーティングライブラリの高度な機能を必要としなd ‚ TanStack Router も最低限のルーティング機能だけを利用 前提
  6. TanStack Router 移行背景 C React Router v5 を利G C 250

    ページに及ぶルーティングを1つのファイルで管理d C RoleRoute, ProtectedRoute の混 C 違いについては後述 障壁
  7. TanStack Router について ~ルーティング~ TanStack Router は下記の二種類のルーティング手段を提供している File-Based Routind x

    ディレクトリ・ファイルの構造に応じてルーティングルールを設“ x src/pages/hoge/$fuda/index.tsx -> /hoge/:fuga にマッ› x src/pages/hoge/$fuda/-Example.tsx -> - プレフィックスはルーティングに含まれなv x 他にも様々なルールがある ( ) 参考 Code Based Routind x 以前の管理面と同様にコードにルーティングルールを記載する
  8. TanStack Router について ~ルーティング~ TanStack Router は下記の二種類のルーティング手段を提供している File-Based Routind x

    ディレクトリ・ファイルの構造に応じてルーティングルールを設“ x src/pages/hoge/$fuga/index.tsx -> /hoge/:fuga にマッ› x src/pages/hoge/$fuga/-Example.tsx -> - プレフィックスはルーティングに含まれなv x 他にも様々なルールがある ( ) 参考 Code Based Routind x 以前の管理面と同様にコードにルーティングルールを記載する →ルーティングファイル肥大化問題を解決するため採用
  9. AST の解析について AST の解析には jscodeshift を利用 p JavaScript の codemod、TypeScript

    でも利用可 p 左図のように AST を見ながらコーディングするのがv p 類似のライブラリでは ts-morph が上げられa p 管理面リポジトリでは既に jscodeshift の環境が整ってい たため、今回は jscodeshift を利用 p https://github.com/facebook/jscodeshif‹
  10. ページの移行 url  ページの URL を示す isUnstated  後述 filePath

     移行後のファイルパス beforeDepth, afterDepth  移行前移行後のルートからの深さ componentPath  移行前のファイルパス
  11. 障壁② ~3世代に渡る状態管理ライブラリの混在~ WinTicket 管理面では3種類の状態管理ライブラリが混在している unstate‹ ƒ Class Component 時代の状態管理ライブラ— ƒ

    一番の障壁 Recoi‡ ƒ Hook ベースの状態管理ライブラリ TanStack Quer– ƒ 非同期状態の管理を得意とするライブラ— ƒ 最近 WINTICKET 本体は Redux から TanStack Query に移行した (参考) 障壁
  12. 障壁② ~3世代に渡る状態管理ライブラリの混在~ その他 unstated /$campaignId ├─ index.tsx : ルーティング用のコンポーネント └─

    -CampaignDetail.tsx : ページの実態 ├─ -Injector.tsx : ロジックとステートを注入する層 /$campaignId ├─ index.tsx : ルーティング用のコンポーネント └─ -CampaignDetail.tsx : ページの実態
  13. 目次 01 WINTICKET について 02 TanStack Router への移行背景 03 ページの移行

    04 ルーティング処理の移行 05 移行してみて 06 おわりに
  14. ルーティング処理の移行 前提 C react-router v5 が提供する Route コンポーネントを利用していた C Route

    コンポーネントは対象に RouteComponentProps で定義された型を インジェクトすh C ※v6 では非推奨 C RouteComponentProps の中でも、history, location, match のみが利用されていw C history : History オブジェクト。主に history.push でのページ遷移に利{ C location : History API の location インターフェーj C match : パスパラメータを取得するために利用
  15. ルーティング処理の移行 方針 8V location, history, match それぞれ Props で 展開されている

    → コンポーネント内で Hook を利用 rV match.params を useParams に書き換f € from には前述の route-info.json を利用 uV location.search を location.searchStr に 書き換え
  16. ルーティング処理の移行 方針 8V location, history, match それぞれ Props で 展開されている

    → コンポーネント内で Hook を利用 rV match.params を useParams に書き換f € from には前述の route-info.json を利用 uV location.search を location.searchStr に 書き換え
  17. ルーティング処理の移行 方針 8V location, history, match それぞれ Props で 展開されている

    → コンポーネント内で Hook を利用 rV match.params を useParams に書き換f € from には前述の route-info.json を利用 uV location.search を location.searchStr に 書き換え
  18. ルーティング処理の移行 方針 8V location, history, match それぞれ Props で 展開されている

    → コンポーネント内で Hook を利用 rV match.params を useParams に書き換f € from には前述の route-info.json を利用 uV location.search を location.searchStr に 書き換え
  19. ルーティング処理の移行 方針 8V location, history, match それぞれ Props で 展開されている

    → コンポーネント内で Hook を利用 rV match.params を useParams に書き換f € from には前述の route-info.json を利用 uV location.search を location.searchStr に 書き換え もちろんこれは既存実装が統一されている場合の話です 実際は AST の変換をしやすいように 事前にコードを整える必要がありました
  20. 障壁③ ~useHistory~ TanStack Router が useHistory Hook を提供していない 自前で実装する 障壁

    解決策 useHistory とはp € History オブジェクトにアクセスするための Hook € React Router v6 でも廃止
  21. 今後の展望 unstated の脱È ‘ 現在チーム一丸で進行中 ‚ ‘ -Injector.tsx が存在する unstated

    が利用されているページを TanStack Query に移行‚ ‘ -Injector.tsx が生えたことで、unstated に依存しているページの特定が楽に useHistory の脱È ‘ useNavigate, useParams, useSearch 等の TanStack Router が提供する Hook に移行
  22. We are HIRING !!! … WINTICKET Web で働いてくれる人を募集していますS … 圧倒的若手チーム(全員20代8

    … Web っぽいことだけに閉じずに CI/CD やインフラ周りを触る機会もアリ