Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Roconで実現する超型安全なルーティング / Super Type-safe routing...
Search
LINE Developers
December 18, 2020
Technology
4
3.3k
Roconで実現する超型安全なルーティング / Super Type-safe routing with Rocon
uhyo (LINE株式会社)
UIT meetup vol.11『フロントエンド紅白LT合戦』での発表資料です
https://uit.connpass.com/event/197740/
LINE Developers
December 18, 2020
Tweet
Share
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
1
2k
Java 21 Overview
line_developers
6
1k
Code Review Challenge: An example of a solution
line_developers
1
1.1k
KARTEのAPIサーバ化
line_developers
1
450
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.1k
A/B Testing at LINE NEWS
line_developers
3
870
LINEのサポートバージョンの考え方
line_developers
2
1.1k
Other Decks in Technology
See All in Technology
エンジニアカフェ忘年会2024「今年やらかしてしまったこと!」
keropiyo
0
100
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
280
UI State設計とテスト方針
rmakiyama
3
790
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
あの日俺達が夢見たサーバレスアーキテクチャ/the-serverless-architecture-we-dreamed-of
tomoki10
0
500
JVM(JavaVM)の性能分析者観点で探るInstanaの可能性
instanautsjp
0
120
AWS環境におけるランサムウェア攻撃対策の設計
nrinetcom
PRO
0
170
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
160
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
180
最近のSfM手法まとめ
kwchrk
2
250
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
290
React Routerで実現する型安全なSPAルーティング
sansantech
PRO
2
280
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Navigating Team Friction
lara
183
15k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Writing Fast Ruby
sferik
628
61k
A designer walks into a library…
pauljervisheath
205
24k
Optimizing for Happiness
mojombo
376
70k
What's in a price? How to price your products and services
michaelherold
244
12k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
910
Transcript
Roconで実現する 超型安全なルーティング UIT meetup vol.11『フロントエンド紅⽩LT合戦』 uhyo
About Speaker uhyo LINEのフロントエンドエンジニア TypeScriptとReactが主な武器 登壇するといつも型安全性の話をする
ルーティングライブラリとは? ブラウザのアドレスバー https://uit-inside.linecorp.com/ HTML5 History API history + react-router vue-router
Next.js next/router <Route path=“/foo”> <FooPage /> </Route> <Route path=“/bar”> <BarPage /> </Route> VueRouter({ routes: [{ path: “/foo”, component: FooPage }, …] }) pages/foo.tsx pages/bar.tsx HTML5 History API
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム⼊⼒ 画像アップロード 確認画⾯ ※計測周りの要件で全画⾯のURLが違ったりする フォーム データ
フォーム データ 画像 データ
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ
• グローバルなステートに⼊れる 型安全 ステート設計の悪化 再読み込みすると消える・戻る/進むに耐えられない 簡単
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ
• URLに⼊れる パーマネントなURLになる ⼩さいデータ向け 型で制限できない /:param/foo?hello=world
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ
• URLに⼊れる パーマネントなURLになる ⼩さいデータ向け 型で制限できない /:param/foo?hello=world ةݥ
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ
• History Stateに⼊れる 再読み込み・戻る/進む に耐える URLには⼊らない 型で制限できない
画⾯間のデータ受け渡し、どうしてますか? 画⾯1 画⾯2 画⾯3 フォーム データ フォーム データ 画像 データ
• History Stateに⼊れる 再読み込み・戻る/進む に耐える URLには⼊らない 型で制限できない ةݥ
画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js <Link href=“/uhyo/?hell=world”> Pika! </Link> //
vue-router <router-link to=“/masao?hello=world”> Pika! </router-link> • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } });
画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js <Link href=“/uhyo/?hell=world”> Pika! </Link> //
vue-router <router-link to=“/masao?hello=world”> Pika! </router-link> • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } }); typo 誰? 渡し⽅間違えた
画⾯遷移を発⽣させるコード • コンポーネント型 // react-router・Next.js <Link href=“/uhyo/?hell=world”> Pika! </Link> //
vue-router <router-link to=“/masao?hello=world”> Pika! </router-link> • API型 // react-router history.push({ pathname: “/uhyo”, state: { hello: “world” } }); typo 誰? 渡し⽅間違えた ةݥ
遷移フローが複雑になるととてもつらい
全ての危険性をRoconで克服する Rocon (ロゴ描いてくれる⽅募集中) 安全第⼀に作られたルーティングライブラリ ⽂字列ベースのルーティング定義を脱却、Builderパターンを採⽤ params, query
string, history stateを抽象化したインターフェース Routeオブジェクトの導⼊によりページ遷移も型安全に わたしが 作りました
Roconでのルート定義 Rocon Routesオブジェクトを組み⽴てる 既存ライブラリ ⽂字列/ファイルシステムベースの 定義
Roconでのルート定義 Rocon ?hello=xxx や history stateも ルート定義の⼀部 既存ライブラリ ?hello=xxx や
history stateは コンポーネント内で取得 ةݥ ▼ /bar?hello=xxx の定義
Roconでのページ遷移 Rocon 遷移先ルートのRouteオブジェクトを使⽤ searchやhistory stateは matchオブジェクトとして抽象化 既存ライブラリ search や history
stateは⽂字列や ⽣データで指定
Roconでのページ遷移 Rocon 与えるデータを間違えると型エラー 既存ライブラリ 与えるデータを間違えても 怒られない ةݥ
Roconの安全性 ⽂字列ベースのルート定義をやめたことで 豊富な型情報を利⽤可能になった ルート定義とルートへの遷移で同じ対象(Routeオブジェクト)に 依存することでページ遷移の安全性を実現した
悩み RoconによりReactユーザーは型安全な世界を⼿に⼊れた Vue版は提供していないが多分作れる? しかしNext/Nuxtユーザーをٹࡁできない…… ファイルシステムベースのルーティングをopt-outできない ⽂字列ベースと同じくらい危険
まとめ ルーティングがどれだけ危険か分かりましたか? Roconでルーティングも型安全なReactアプリ開発をしよう (複数の⼊⼒⼿段がmatch objectに抽象化されるのも良い点) Twemoji by Twitter, Inc and
other contributors ‒ CC-BY 4.0