🐈

RSCに関する知見(随時更新)

2024/09/13に公開

React Server Components(以下、RSC)、Server Actions(以下、SA)に関する知見(と意見)を随時更新していきます。

また、クライアントサイドは以下、CSと表記します。

  • RSCは画面に表示する分しかクライアントに送信されないため、セキュリティ、パフォーマンス、ペイロードサイズの面で優れる。
  • SAは「関数に対して、APIエンドポイントが自動生成される」と考えると良い。
    • 実体はただのAPI呼び出しなので、セキュリティやパフォーマンスは実装次第。
  • SAはRSCの関数内に定義しない方が良い。
    • SAが親スコープの変数に依存すると、意図しないセキュリティやパフォーマンスの問題を生むと思われる
  • RSCのモジュールのスコープに定義し、exportはしない方が良い。つまり、SA自体は使いまわさない方が良い。
    • そうすることで名前付けや依存関係の管理が楽になる。
  • next-safe-actionは使わない方が良いと思われる。
    • せっかくtRPC(ライブラリレベルのサポート)からSA(言語レベルのサポート)に進化したのに、tRPCライクに書けても退化にしかならない。
    • また、SAはJavaScriptの関数として実装できることが強みであるので、実装の自由度が著しく下がる+学習コストもかかるライブラリに依存しない方が良い。
  • CQRSの観点で考えると、傾向として「RSC → Query、SA → Command」の役割を担うことが多い。
    • "あくまで傾向"なので、データ取得用のSAを作ることに問題は無い。
    • RSC内でレンダリング中に更新処理を動かしても、ステートレスであれば、副作用があっても問題無いはず。(例:アクセスカウンター)
  • **依存の向きは、「RSC / SA → クライアントコンポーネント」**にした方が良い。
    • 逆をすると、予期せずクライアント用のバンドルにコードが混在してしまう。(大抵はエラーになりますが)
  • CSで動くコンポーネントが、SAを依存注入してもらう構成が多くなるし、スッキリする。
    • SAの関数の型定義をクライアント側のコンポーネント(あるいはモジュール)に定義し、SA側からimportすると良い。
    • CSのコンポーネントを使いまわすことになった場合に、インターフェースを統一できるメリットもある。
  • SEO関連metatitlelinkタグを任意の箇所に設置できるようになる。
    • Next.jsだとHeadコンポーネントを使うと良い。
    • 上記のやり方でないと、RSC内の処理で動的にドキュメントのメタデータを設定できないため、最も正しい方法と思われる。
  • URLのパス/クエリパラメータの取得は、Next.jsだとPage関数の引数で受け取れる。
    • 検索するとミドルウェアを利用する方法が出てくるが、おそらく古い。

あれ、やはりまだまだ少ないですね。なるべく気付いた点は随時追加・更新していこうと思いますので、よろしくお願いします。

RSCを知らない方は、ハンズオンを作ったので是非試してみてください。(一部、上記の知見が反映されていない箇所もありますが、ご容赦ください)

https://github.com/coder-ka/rsc-handson

Discussion