Slide 1

Slide 1 text

Roconで実現する 超型安全なルーティング UIT meetup vol.11『フロントエンド紅⽩LT合戦』 uhyo

Slide 2

Slide 2 text

About Speaker uhyo –LINEのフロントエンドエンジニア –TypeScriptとReactが主な武器 –登壇するといつも型安全性の話をする

Slide 3

Slide 3 text

ルーティングライブラリとは? ブラウザのアドレスバー https://uit-inside.linecorp.com/ HTML5 History API history + react-router vue-router Next.js next/router VueRouter({ routes: [{ path: “/foo”, component: FooPage }, …] }) pages/foo.tsx pages/bar.tsx HTML5 History API

Slide 4

Slide 4 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム⼊⼒ 画像アップロード 確認画⾯ ※計測周りの要件で全画⾯のURLが違ったりする フォーム データ フォーム データ 画像 データ

Slide 5

Slide 5 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ • グローバルなステートに⼊れる 型安全 ステート設計の悪化 再読み込みすると消える・戻る/進むに耐えられない 簡単

Slide 6

Slide 6 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ • URLに⼊れる パーマネントなURLになる ⼩さいデータ向け 型で制限できない /:param/foo?hello=world

Slide 7

Slide 7 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ • URLに⼊れる パーマネントなURLになる ⼩さいデータ向け 型で制限できない /:param/foo?hello=world ةݥ

Slide 8

Slide 8 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ • History Stateに⼊れる 再読み込み・戻る/進む に耐える URLには⼊らない 型で制限できない

Slide 9

Slide 9 text

画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ • History Stateに⼊れる 再読み込み・戻る/進む に耐える URLには⼊らない 型で制限できない ةݥ

Slide 10

Slide 10 text

画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js Pika! // vue-router Pika! • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } });

Slide 11

Slide 11 text

画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js Pika! // vue-router Pika! • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } }); typo 誰? 渡し⽅間違えた

Slide 12

Slide 12 text

画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js Pika! // vue-router Pika! • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } }); typo 誰? 渡し⽅間違えた ةݥ

Slide 13

Slide 13 text

遷移フローが複雑になるととてもつらい

Slide 14

Slide 14 text

全ての危険性をRoconで克服する Rocon (ロゴ描いてくれる⽅募集中) – 安全第⼀に作られたルーティングライブラリ – ⽂字列ベースのルーティング定義を脱却、Builderパターンを採⽤ – params, query string, history stateを抽象化したインターフェース – Routeオブジェクトの導⼊によりページ遷移も型安全に わたしが 作りました

Slide 15

Slide 15 text

Roconでのルート定義 Rocon Routesオブジェクトを組み⽴てる 既存ライブラリ ⽂字列/ファイルシステムベースの 定義

Slide 16

Slide 16 text

Roconでのルート定義 Rocon ?hello=xxx や history stateも ルート定義の⼀部 既存ライブラリ ?hello=xxx や history stateは コンポーネント内で取得 ةݥ ▼ /bar?hello=xxx の定義

Slide 17

Slide 17 text

Roconでのページ遷移 Rocon 遷移先ルートのRouteオブジェクトを使⽤ searchやhistory stateは matchオブジェクトとして抽象化 既存ライブラリ search や history stateは⽂字列や ⽣データで指定

Slide 18

Slide 18 text

Roconでのページ遷移 Rocon 与えるデータを間違えると型エラー 既存ライブラリ 与えるデータを間違えても 怒られない ةݥ

Slide 19

Slide 19 text

Roconの安全性 –⽂字列ベースのルート定義をやめたことで 豊富な型情報を利⽤可能になった –ルート定義とルートへの遷移で同じ対象(Routeオブジェクト)に 依存することでページ遷移の安全性を実現した

Slide 20

Slide 20 text

悩み –RoconによりReactユーザーは型安全な世界を⼿に⼊れた –Vue版は提供していないが多分作れる? –しかしNext/Nuxtユーザーをٹࡁできない…… – ファイルシステムベースのルーティングをopt-outできない – ⽂字列ベースと同じくらい危険

Slide 21

Slide 21 text

まとめ –ルーティングがどれだけ危険か分かりましたか? –Roconでルーティングも型安全なReactアプリ開発をしよう (複数の⼊⼒⼿段がmatch objectに抽象化されるのも良い点) Twemoji by Twitter, Inc and other contributors ‒ CC-BY 4.0