Open10

HonoでReact Server Components (RSC)をする

kobakenkobaken

RSCとは?


簡潔に解釈した内容はこう。

  • RSCはSSRとCSRそれぞれの長所短所をつなぐハイブリッド機能。具体的には、コンポーネント情報をバックエンドとフロントエンドでやりとりするための仕組み(RSC Payload)を通じて、次の2つの機能を実現してる。
    • SSRされたコンポーネントにインタラクティブにする
    • クライアントからサーバー側で定義されたアクションを呼び出す(サーバーアクション)
kobakenkobaken

RSC Payloadの雰囲気を、すでにRSC実装がなされている Next.js, Wakuを眺めて感じてみる。


  • self.__next_fself.__FLIGHT_DATA に、payloadデータが入ってる
  • これを実現するのに、React リポジトリに、react-server-dom-webpack, react-server-dom-turpopackといったトランスパイラー向けのパッケージが用意されている。これをメタフレーム側では利用すれば良さそう。
  • Next.js は、react-server-dom-turpopack と このRSC Payload生成くんあたりが肝っぽい。
  • Wakuは、react-server-dom-webpack と rsc-html-stream を組み合わせて、streamにRSC Payloadデータをinjectionしているよう。

kobakenkobaken

雰囲気実装した

https://sample-hono-rsc.kfly8.workers.dev/

https://github.com/kfly8-sandbox/sample-hono-rsc

実装の状況:

  • SSRされたコンポーネントをインタラクティブにする
  • サーバーアクション
  • インテグレーション / tailwindcss
  • 細かな動作確認

どうやって実装した?

  • @hiogawa/vite-rsc を利用
    • rsc-html-stream を利用したサンプル実装が用意されてるので、それを参考にガチャガチャした
  • ただこれを実装仕切るには、Viteにも詳しくなる必要がありそう。一旦、現時点の状態で公開する。
kobakenkobaken

サーバーアクションで用意したserver-counterが、
別コンポーネントのSuspenseが解決した後、DOM構造が代わってDOMの更新できなくなるようだ。