Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
これからの時代に向けて RSCを使いこなす
Search
fuku
January 19, 2024
35
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
これからの時代に向けて RSCを使いこなす
fuku
January 19, 2024
More Decks by fuku
See All by fuku
Temporalはなぜ必要なのか
akito_fukuda
0
66
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Raft: Consensus for Rubyists
vanstee
142
7.8k
First, design no harm
axbom
PRO
2
1.3k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
Why Our Code Smells
bkeepers
PRO
340
58k
Prompt Engineering for Job Search
mfonobong
0
520
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Transcript
これからを見越して RSCをうまく使いこなす ふくだ あきと
自己紹介 名前:ふくだ あきと 経歴:2年半 受託開発企業(21年1月 ~ 5月) フリーランス(21年6月 ~ 12月)
自社開発企業(21年12月 ~ 22年12月) 現所属:令和トラベル inc. フロントエンドエンジニア (TypeScript、React、Next.js) 趣味:麻雀、アニメ、音楽 etc.
フロントエンド、マジで変化速くね?
Next.js の SSG だとか ISR… Vite がどうのこうの…
中でも大きなトピック 「RSC」
RSCを使いこなす =つよつよエンジニアへの第一歩(?)
ということで、 RSCの活用方法をみていく
RSCとは React Server Components の略 1. サーバー側でJSをHTMLに変換 2. クライアント側にJSONとして送信 3.
クライアントで解釈して画面に表示する → ブラウザからすると、 「サーバーから仮想DOMをシリアライズしたものが返ってくる」
RSCの特徴 1. データ取得周りのパフォーマンスが向上する a. サーバー側でコンポーネントを生成するため、 より早くサーバーからデータを取得することができる。 2. クライアント側のJSを減らすことができる a. サーバー内でHTMLを生成するため、
クライアント側に送るJSが減り、結果バンドルサイズが減る。 3. クライアントコンポーネント内でインポートできない
RSCの特徴 1. データ取得周りのパフォーマンスが向上する a. サーバー側でコンポーネントを生成するため、 より早くサーバーからデータを取得することができる。 2. クライアント側のJSを減らすことができる a. サーバー内でHTMLを生成するため、
クライアント側に送るJSが減り、結果バンドルサイズが減る。 3. クライアントコンポーネント内でインポートできない
では、RSCを活用していく方法を見ていく
まずはクライアントコンポーネントの 動作をみてみる
実際の実装と動作 1. ボタンを押下 2. データ取得が始まり、 fallback が表示される 3. 非同期処理が解決され、 画面に取得したリストが表
示される
export const ClientComponent = () => { const [isShow, setIsShow]
= useState(false); return ( <> <button onClick={() => setIsShow(!isShow)}> Show </button> {isShow && ( <Suspense fallback={<div>Loading...</div>}> <Posts /> </Suspense> )} </> )}; const Posts = () => { const promise = getPosts(); const posts = use(promise); return ( <ul> {posts.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> ); }; 実際のコード
この実装の辛み ❏ ボタンをクリックしてからデータ取得が始まっている ❏ クリックするたびに API を呼んでいる
この実装の辛み ❏ ボタンをクリックしてからデータ取得が始まっている ❏ クリックするたびに API を呼んでいる → リスト表示の待ち時間が増え、UX が損なわれる原因となる
これをRSC を使って解決したい
RSC で書き換えてみる export const ServerComponent = async () => {
const posts = await getPosts(); return <ClientComponent posts={posts} />; }; const Posts = ({ posts }) => { // const promise = getPosts(); // const posts = use(promise); return ( <ul>...</ul> ); }; ⬅ 代わりに RSC で取得 ⬅ クライアント側では取得しない
データ取得をすることによる UX の低下は改善された
とみせかけて、まだ完璧ではない。
それどころか
さらなる問題点を抱えることになる。
こんな感じになる
さらなる問題点とは 非同期処理の解決するまで await を使用して待っている状態 ⬇ つまりは... 非同期処理が解決されるまで クライアントコンポーネントのレンダリングをブロックする ことになる
さらなる問題点とは 非同期処理の解決するまで await を使用して待っている状態 ⬇ つまりは... 非同期処理が解決されるまで クライアントコンポーネントのレンダリングをブロックする ことになる →
重い API だった場合、レンダリングの待ち時間が増え、 かなり UX が損なわ れてしまう
では、どうすべきか export const ServerComponent = async () => { const
promise = getPosts(); return <ClientComponent promise={promise} />; }; const Posts: FC<PostsProps> = ({ promise }) => { const posts = use(promise); return ( <ul>...</ul> ); }; ⬅ ここで非同期処理を解決しない ⬅ ここで非同期処理を解決する
こんな感じになる
何が変わった? RSC で await を使わず、非同期処理を解決しないまま ClientComponent に 渡している ⬇ それによって...
データ取得を待つことなく、 レンダリングすることが可能になった
UX を損ねることなく、 効率よくデータを表示することができた
これはもう
RSC を使いこなすことに 成功したといっても過言ではない!!
あえて非同期処理を解決しないことによって、 ❏ データ取得をサーバー側で実行 ❏ データ取得を待つことなく、UI を表示 といった RSC の特徴を活かした使い方ができた。 ❏
ボタンをクリックする前にデータ取得によって UI がブロックされること ❏ ボタンをクリックするたびにデータ取得が実行される といったことがどちらも解決され、ウハウハになれる。 まとめ
以上、ありがとうございました!