2023/7/5 RSCとかの話
react server components
react RFC
https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md
https://github.com/reactjs/rfcs/blob/main/text/0227-server-module-conventions.md
参考
React Server Componentsの仕組み:詳細ガイド | POSTD
これ読んでmiyamonz.iconは理解した
一言で理解するReact Server Components
一言で言うと、React Server Componentsは多段階計算です。
Next.js Server Actions と revalidate 周りの挙動を確認する
revalidateの挙動についてはこれ
miyamonz.icon視点の解説
Reactって要するに仮想DOMで宣言的にやって、よしなにDOMに反映してくれる君
仮想DOMって要するにJSのオブジェクト
なので、もしも仮想DOMのオブジェクトがシリアライズ可能であるなら、サーバ、クライアント間をまたいで転送できる
code:TS
async function UserData() {
const data = await prisma.user.getInfo()
return <div>user: {data.username}</div>
}
これをサーバ上で評価して、出来上がった<div>user: {"miyamonz"}</div>は、理論上はシリアライズできる
それを実際に実現したもの
なので、仮想DOMをシリアライズしようとしたときに自然と想起される問題点を抑えておけばRSCの理解ができる
たとえばコールバック渡すのは無理だろとか
ここらへんをPOSTDの記事は解説してくれてる
モジュール参照とかを理解すれば、クライアントコンポーネントの子にサーバコンポーネントを渡せるとかもわかる
Server Component からClient Componentの利用
code:TS
import SomeClientComponent from './SomeClientComponent'
//これはserver component
export default async function UserData() {
const data = await prisma.user.getInfo()
// const data = fetch({... revalidate: 60}) // fetchもここでよべる
return <div>user: {data.username}
<SomeClinetComponent />
</div>
}
< Hoge /> これは関数実行
createElement
jsx-runtime
モジュール参照オブジェクトにすればいい
”use client"
サーバ - クライアント境界に必要
import "client-only"
pnpm?
npm i 入れなくてもserver-onlyは動いたはず
メモ
RSC、server action、on-demand revalidationでPHPのような世界をNext.jsにもたらす
Server Actions
React Flightって何なのか分からんので追いかける
server actionの通信のやり取りの中身を見てみる
https://github.com/miyamonz/example-next-sst
page, route単位での設定
https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config
別ブラウザにrevalidateは走るのか?
→無理
revalidateはserver actionのレスポンスの中にReact flightのプロトコルで帰ってくるから
でもrevalidate叩けばOK