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
Dive Into Single Fetch
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
YUMOTO Michitaka
September 25, 2024
Technology
290
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dive Into Single Fetch
Remix Meet Up Tokyo#2
YUMOTO Michitaka
September 25, 2024
More Decks by YUMOTO Michitaka
See All by YUMOTO Michitaka
Short Introduction for Kysely
gothedistance
1
500
クラフトマンシップ(職人魂)を湾岸MIDNIGHTから学ぼう / Learn Craftsmanship from Wangan Midnight
gothedistance
0
360
プロ野球をデータモデリングしてみたら沼だった件 / Baseball ERD Modeling to be obsessed
gothedistance
2
920
フロントエンド開発スタイルの変遷と、私がFlutterにハマったわけ
gothedistance
8
15k
ITプロジェクトのはじめ方 / How to work around software project
gothedistance
28
150k
私がITプランナーを志すようになった理由、そして、目指していること / bpstudy142_why_i_wanna_be_a_it_plannner
gothedistance
1
970
ITプランナーの必要性を小一時間問い詰めたい / Why We need IT-Planner.
gothedistance
0
14k
IT企画をちゃんとやりたい#01 ガイダンス資料 / IT Planning do well_01
gothedistance
0
6.5k
bpstudy_127
gothedistance
0
600
Other Decks in Technology
See All in Technology
GopherCon @シアトル に行ってきました
logica0419
0
390
エージェント化するAI:現在地とその先に起きる変化 / AI as Agents: The Current State and the Changes Ahead
ks91
PRO
0
160
Kiro Crew で始める マルチエージェント開発
miu_crescent
PRO
0
200
AIレビュー時代に必要なのは、SLOで引く撤退ライン
nobuoooo
0
150
Distributed Transactions Under Fire: Building a Zero-Oversell Flash Sale Platform with Amazon Aurora DSQL
yama3133
1
110
みてねにおけるAI-DLC導入活動とAIドリブン開発の現在地/JAWS-UG AI-DLC #2
isaoshimizu
2
280
指示待ちから変化に応じるClaude Codeへ!~環境からAgentへの帰り道を作る~
gotalab555
8
1.6k
markdown-poster Introduction
kazamori
0
400
会計事務所と顧問先の契約関係をOIDC・OAuthで表現する
terara
0
500
AWSとAzureのマルチクラウド活用における強い味方___AWS_Kiroを使った二刀流スキル作成.pdf
duelist2020jp
1
140
AI時代のデータ基盤を考える問い
pacocat
0
740
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
2
720
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
480
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
670
Optimizing for Happiness
mojombo
378
71k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
450
Odyssey Design
rkendrick25
PRO
2
780
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
Utilizing Notion as your number one productivity tool
mfonobong
4
560
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Transcript
Dive into Single Fetch Remix Tokyo Meetup #2 (2024.09.25) @gothedistance
Self Introduction ゆもとみちたか@1979.11.12 X: @gothedistance GoTheDistanceというブログを書いています 新卒SIer→Webエンジニア→2016年独立して9年目 Javaエンジニア→PHP/Python→Flutter→Remix/TS 東京ヤクルトスワローズのファンです! 2
Agenda Single Fetch 概説 ドキュメントリクエストとクライアントサイドリクエスト turbo-stream の活用 Middleware の実装を追いかけた結果wwwwww 3
Single Fetch Just because unstable, doesn’t mean very buggy. 個人的に最も大きなRemixの改善点
4
Single Fetch(Fetchをするのはたった1つ) 2.9から導入されたRemixのリクエスト処理 2.9以前では・・・ ドキュメントリクエストの場合は GET /about/me をfetchして、該当する loaderが実行される。 クライアントサイドでページ遷移する場合、
GET /about と GET /about/me に対して、個別のリクエストを飛ばしていた。 loader個別にリクエストが飛んでしまうと、MiddlewareやServer Context などの実装に支障がががが。個人的にRemixの最もネガポイント。 Single Fetchでは、クライアントサイドでのページ遷移において も、ドキュメントリクエストと同様に処理される。ナイス〜。 5
turbo-streamによるdecode/encode JSON.stringify でデータをシリアライズしていた。E2Eで型安全が できるのに、DateがStringになるのは微妙といえば微妙。 turbo-stream によって、JavaScriptのオブジェクトがByteStreamと して渡される(そういう実装に読めた)為、デコード時に型が保てる ようになった。 Promiseを返す時は defer
でStreamを返し、そうでない時は json で シリアライズする実装が、 turbo-stream によってStreamに統一。 Single FetchがStableになると、 json と defer は非推奨になる気が する。必然性がなくなるから。 6
Promiseを返して遅延ロード 自分のようなReact初心者は、 Promise を返すという発想が衝撃。 export async function loader({params}: LoaderFunctionArgs) {
const reviewsPromise = db.getReviews(params.productId); return { reviews: reviewsPromise }; } export default function Product() { const { reviews } = useLoaderData<typeof loader>(); return ( <Suspense fallback={<ReviewsSkeleton />}> <Await resolve={reviews}> {(reviews) => <ProductReviews data={reviews} />} </Await> </Suspense> )} 7
お手軽バックグラウンドタスク レスポンスを返す処理と同期せず、バックグラウンド・タスクが実 行できる。Pythonだと明示的にスレッド立ててやっていた記憶。 export async function action({params}: ActionFunctionArgs) { //
バックグラウンドで実行される setImmediate(() => sendmail(params)); // こっちは即座にレスポンスを返す return { success: true }; } export default function Product() { const { success } = useActionData<typeof action>(); return ( {success ? <p>メール送信しました</p> : <p>メール送信中</p>} )} 8
Middleware Support Single Fetchだけでは実現できない 9
Middlewareのロードマップは不透明に見える リクエスト・レスポンスの前処理・後処理をグローバルに行うため の仕組み。FastAPIなどのWAFをお使いの方でお馴染み。 Remixは 全てのloaderを並行に実行する ポリシーのため、loaderが呼び 出される前にMiddlewareが実行される必要があると思われる。 /a /a/b /a/b/c
のルートで、 /a/b/c に対してリクエストが発行さ れると、ルートから並行に /a /a/b /a/b/c のloaderが実行され る。 /a の評価を待つことはない。 loaderの処理を待つとシーケンシャルになるため、パラレルが売り のRemixの看板に偽りがあることに... 10
entry.sever.tsxをゴニョれば・・・? ドキュメントリクエストでは通るけど、クライアントサイドのリク エストでは handleRequest が実行されない。 11
HTTPサーバで頑張るぞい Remixの loader/action の中でMiddlewareを頑張るのは難しいが、 Expressのレイヤーでゴニョるならいけるんじゃないか? Single FetchによってFetchする対象が1個のみになったのだから! 月曜日の夜にそれに気づいた私は、あわてて情報を探しました Remix flat
Route でRemix Devを救った killman 氏が、カスタムの express ビルドプラグインを公開していた。 https://github.com/kiliman/remix-express-vite-plugin/ 上記のプラグインの解説動画: https://www.youtube.com/watch? v=_dbMs9D5kdQ 12
次回予告(出オチ) remix-express-vite-plugin を使って Middleware を実装してみた zennあたりに来月公開予定 13