はじめに
panda CSSを触ってみたんですが、サーバー側でbuildするので、クライアント側での変更をいちいちCSSに反映するのが難しそうに思える。
まぁぼくの調査不足だと思うので、一旦pandaCSSを調査することにした。
その時に出てきたのが、「RSC互換性」というワードであり、いわゆるReact Server Components
との互換性のことである。
「いや、、RSCよく知らんな」ということで調査します。
調査
まっさきにこの記事が出てきたので読んでまとめる。
- RSCはReactコンポーネントをサーバーサイドでレンダリングする技術
- もちろんClientでのレンダリングも両立が可能なので、部分的に処理を早くしたりなどができる
- また、React Server ComponentsはConcurrent Modeに完全対応し、それを前提として動作します。
- RSCはコンポーネントを三種類に分類します
- Server Components
- Client Components
- 従来のクライアントのみでレンダリングされるコンポーネントのこと
- 従来のコンポーネントですが、拡張子を
.client.js
とする必要がある - ステートを持ったり、イベントをハンドルしたり、WebAPIを利用したりする必要があるときに利用
- Server Componentsをimportすることはできません
- Server componentsのレンダーに必要なサーバーへのリクエストのせいでのパフォーマンス低下を防ぐため
- childrenなどのpropを通じてServer ComponentsをClient Componentsに渡すことはできる
- これはServer ComponentsをレンダリングしたJSXをpropsに渡すだけなので、ただのJSXを渡すことに等しい
- Shared Components
- 筆者が考えるベストプラクティスは以下
- 基本的にパフォーマンス有利なServer Componentsにする
- ステートが必要だったり、イベントをハンドルしたかったりするときはClient Components
- 両方で使いたいときはShared Componentsに。
- RSCの恩恵はパフォーマンス面が主
- バンドルサイズの減少
- データフェッチにかかる時間の減少
- Server Componentsはサーバー上で実行されるため、データに直接アクセスできることがあり、レイテンシーを大きく抑えられる
- 一つのデータフェッチが完了した後に別のフェッチが開始するような
Waterfall
の影響が小さくなります
- Code Splittingの自動化
- Server Componentsのレンダリングが終了した時点で、必要となるClient Componentsがどれかというのが判明します
- RSCでは、自動でClient Componentsを切り分けてバンドル化し、必要となるもののみをクライアントに指定してダウンロードさせる
- レンダー結果のDOMへの更新は最小限
- SSRとは別技術であり、共存が可能です
Concurrent Modeが何かわからん、調べる。
- Concurrent Modeは日本語でいうと「並列モード」
- 背景
- TransitionやDefferredValueが正式な並列ができるAPIとしてリリースされました