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

React のルーター事情

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

React のルーター事情

Avatar for sadnessOjisan

sadnessOjisan

February 20, 2025
Tweet

More Decks by sadnessOjisan

Other Decks in Programming

Transcript

  1. 自己紹介 • ID: sadnessOjisan • 近況: 生活が破壊されるレベルで、ポケカ と ポケ モンにハマった。今日持ってきています。

    • ゆるぼ: 地面師が飲んでいたウイスキーを飲みにい きませんか(6人くらいで30mlを割り勘すれば飲め そう) 2
  2. 今日のお題: React とルーティング • React のルーティングの常識が変わりつつある(n回目) のでおさらいしよう ◦ react-router v3

    ◦ react-router v4 ◦ tanstack router ◦ react-router v6 ◦ react-router v7 ◦ Next.js app router • SSR もする時代なので HTTP サーバーにおけるルーティングから見ていこう 3
  3. 補足: なぜ Ruby で例を書いたか • HTTP を教えるための題材として一番良い言語だと思っている • ライブラリなしで、サーバーを自作するための必要な機能が一通り揃ってい る。(socket,

    erb(template engine)) • JS だと body parser が必要、Go だと最初から組み込みの HTTP が含まれて しまっている • それでいてRubyは Mac であれば環境構築が不要 サーバーを教える研修をする時はRubyを使うようにしている 8
  4. URLを操作できるhistoryオブジェクト • SPAのHTMLは1つなので、/hoge のようなページでリロードしても hoge.html は手に入らない • history オブジェクトを使った初期化が肝 •

    history を使うことでJSの世界からURLを変えられる • push で状態を積んでいけるので、ブラウザバックもできるようになる 11
  5. react-router 以外の台頭 • react router v4 あたりは上記の世界観のルーターだった。競合は reach-router • react-router

    v4 は破壊的変更がすごくて(onEnterなど)警戒される( IMO: ここで痛い目を見ると remix に対する目が...) • その後に tanstack router が台頭してくる • また routing library ではないが VS next.js という構図でも見られるように なってきた(Nextなくてもvite+react-routerでいいよね?という言説 19
  6. react-router のフレームワークとしての進化 • Nextの流行りはじめの時期に Remix が react-router の作者によって作られ ていた •

    react-router と remix が統合されつつあり、react-router がフレームワー クとしての能力を獲得する 20
  7. loader: データフェッチのサポート https://reactrouter.com/6.29.0/hooks/use-loader-data loader 関数で data fetch して return hooks

    で loader から data を取得 データ取得おける状態管理が 不要となっている。 27
  8. loader: データフェッチのサポート https://reactrouter.com/6.29.0/hooks/use-loader-data loader 関数で data fetch して return hooks

    で loader から data を取得 Suspenseのおかげで ローディング管理も楽になる 28
  9. フレームワークの機能は概ね開発効率がよい • ルーターを使わないといけないようなアプリケーションは、ほぼほぼ data fetch や form submit の機能を実装しなければいけない •

    ルーターを入れるだけでそれらの機能が使え、react-router と統合されて使 えるのが嬉しい • 例: ページ切り替え時に勝手にデータを取得・ページ遷移におけるデータの ローディングの状態管理がフレームワークでサポートされる 29
  10. loader と awaited による useEffect 除去 • AwaitedコンポーネントがError Boundaryの機能を持っている •

    Promise を await しなくてよい https://reactrouter.com/6.29.0/components/await 30
  11. outlet による nesting layout の最適化と可読性向上 • タブUIなども Nested Route で表現す

    れば、URL で表示を切り替えられ、状 態管理を不要にできる。 32
  12. 34

  13. react-router v7 による大きな変更 • 破壊的変更はないとされている。実際にない。 • フレームワーク機能とライブラリ機能に分割 • ライブラリ機能を使い続ければ、破壊的変更がない •

    フレームワーク機能においてはルーティングの方法が大きく変わった。 Convention over Configuration が導入され、全てが変わった 35
  14. 37

  15. 導入や移行は少し大変 • Manually Install のためには@react-router/dev/vite, @react-router/node などといったライブラリが必要 • ファイルの配置位置や命名をフレームワークの規約に従わないといけない •

    そもそも記法が大幅に変わる • その上でまだ安定もしていないかつドキュメントも不足している • vite を前提としているので制約があり、将来の技術選定にも制約が生まれる 技術選定にはなる ◦ ツールがバンドラに依存する辛さについて、Zero-runtime CSS in JS のこと、ときどきで良 いから.....思い出してください。 42
  16. In My Opinion • Next を使うことが多め • react-router は自分で準備する部分が多く、自分の好みは Simple

    よりも Easy(果たしてNextがEasyなのかは議論の余地がありますが...) • とはいえ、なにかと人口の多さが正しさなところを感じている。人口が多い と何とかなることが結構ある。なんとかなれ〜〜〜〜〜〜 • 実際には 「SSR 必須か?」 「要件的に useEffect が必要か?」 「Outlet があると綺麗になるか?」 などの星取表思考を元に選定しているので、気に なる方は懇親会などで聞いてください〜 46