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

これからの時代に向けて RSCを使いこなす

Avatar for fuku fuku
January 19, 2024
35

これからの時代に向けて RSCを使いこなす

Avatar for fuku

fuku

January 19, 2024

Transcript

  1. 自己紹介 名前:ふくだ あきと 経歴:2年半    受託開発企業(21年1月 ~ 5月)    フリーランス(21年6月 ~ 12月)

       自社開発企業(21年12月 ~ 22年12月) 現所属:令和トラベル inc. フロントエンドエンジニア (TypeScript、React、Next.js) 趣味:麻雀、アニメ、音楽 etc.
  2. RSCとは React Server Components の略 1. サーバー側でJSをHTMLに変換 2. クライアント側にJSONとして送信 3.

    クライアントで解釈して画面に表示する → ブラウザからすると、  「サーバーから仮想DOMをシリアライズしたものが返ってくる」
  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> ); }; 実際のコード
  4. 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 で取得 ⬅ クライアント側では取得しない
  5. では、どうすべきか export const ServerComponent = async () => { const

    promise = getPosts(); return <ClientComponent promise={promise} />; }; const Posts: FC<PostsProps> = ({ promise }) => { const posts = use(promise); return ( <ul>...</ul> ); }; ⬅ ここで非同期処理を解決しない ⬅ ここで非同期処理を解決する
  6. あえて非同期処理を解決しないことによって、 ❏ データ取得をサーバー側で実行 ❏ データ取得を待つことなく、UI を表示 といった RSC の特徴を活かした使い方ができた。 ❏

    ボタンをクリックする前にデータ取得によって UI がブロックされること ❏ ボタンをクリックするたびにデータ取得が実行される といったことがどちらも解決され、ウハウハになれる。 まとめ