2026/01/30
レンダリング?

React Server Components(以下、RSC)はサーバ立てなくても使えるよ、という記事を読んで、最近やってたことに関連する領域(つまり、興味あることだけ)を把握した。

RSCの世界ではデフォルトがサーバコンポーネントで、HTMLのレンダリングが(で合ってる?)ブラウザ上ではない環境、つまり「サーバ」で起こる。ブラウザはやることが減ってパフォーマンスに効くし、さらにはレンダリングが依存するデータ取得もブラウザ外に出せる。部分的に外に出せる。外に出せない部分は全部クライアントコンポーネントで、今まで通りのReact。Reactの世界の内部にそういう境界がある。

この境界はコンポーネントの親子関係(レンダーツリー)ではなく、それを定義する(ES Module的な意味での)モジュールの依存関係のツリー上にあるのが混乱ポイントになりそう。クライアントコンポーネントが依存つまりimportしてるものは全てクライアントコンポーネントになる。だから、(依存されうる)コンポーネント側の定義を見ても、それがサーバコンポーネントかどうかは確定しない(場合がある)。このあたりの話が丁寧に書かれてるのが'use client'のページなのがちょっと不思議な感じ。

実行環境としてのブラウザが動的にやっている依存解決の位置に境界があるってことなんだろうけど、どっちなのかコンポーネント定義のファイル自身が定義していてエディタで色が変わる、ぐらいの分かりやすさがほしくなってしまう。React Server Components自体が微妙な表現かもしれず、RSCという新しい仕組みの中にサーバコンポーネントとクライアントコンポーネントがある、という区分けになってるっぽい。「'use client' は React Server Components 用の機能です」とか言われて混乱する。そもそも非ブラウザ環境を「サーバ」と呼ぶのも変だけど、それは主なターゲットとなるユースケースなんだろうね。

実態としてはこんな感じ?

  • React Rendering Environment Separation
    • Browser Components
    • Inbound Components

いずれにせよ、最適化のための戦略は難しそう。勝手に良い感じにやっとくのを超えて、ユーザに協力してもらうためにはどうしたらいいか、という話ね。かっこついてたほうがいいかもしれない。

ある世界の内部に異なる環境がある、という意味での面白さだと、Next.jsもそういう面がある。データ取得の静的なもの(ビルド時)と動的なもの(リクエスト時)が1つのページ定義の1つのファイルの中に存在していて、かつ、そのデータを渡す先のReact(のコンポーネント)がいる。この混ざり方、繋がり方が面白くて興味を持ったのが昔々。

で、React Server Componentsにとっての「サーバ」というのはブラウザの外部のことなので、CIサーバ上でも良いし、ローカルマシン上でも良い、というのが「サーバ立てなくても使えるよ」という冒頭の話。「サーバ立てなくても使えるよ」というだけなら、Next.jsのstatic exportsもそうだし、このサイトの出力に使っているrenderToStaticMarkupも同じ。違うのは、Reactの世界の内部に境界を持てるかどうか。Reactが動くCSRなSPAの一部を事前にレンダリングしておけるのがサーバコンポーネント。一部と言わずほぼ全部にしてもいい。(もちろんリクエスト時に一部をサーバサイドでレンダリングできて、それが表向きのアピールポイントなはず。)

このサイトとしてはSPAをやりたいわけではないからReactが動く必要はなく、JSXを扱えるメジャーなレンダリングシステムとしてReactとその関連技術を使い続けているわけだけど、ありうる選択肢として違いが見えて楽しかった。まだちゃんと分かってないところの理解にも繋がりそう。

日付
タイトル

2026/03/14
読んだ本〜2026冬
2026/03/05
聴いてるポッドキャスト
2026/01/30
レンダリング?
2026/01/27
Live
2026/01/26
レンダリング!
2026/01/13
2025年まとめ
2025/09/23
読んだ本〜2025夏
2024/07/24
健康er
2024/02/10
健康
2023/05/19
喪/2
2023/04/24
コンサル
2023/02/01
それはそう
2022/12/17
2022/06/11
動かないもの
2022/06/05
スタイル
2022/04/23
JSX as data
2022/04/08
数学
2021/12/18
Activeな話
2021/09/05
Goのmultiple ABI
2021/07/31
『Goならわかるシステムプログラミング』
2021/07/28
ここにはタイトルが入ります
2021/01/25
これは日記ではない
2021/01/24
修行
2021/01/23
Considered Harmful
2021/01/22
雑感オブSwing
2021/01/21
雑感オブAndroid
2021/01/20
雑感オブiOS
2021/01/19
プログラミング言語その9【Groovy】
2021/01/18
1回休み
2021/01/17
会社を作る
2021/01/16
外国語
2021/01/15
プログラミング言語その8【C】
2021/01/14
プログラミング言語その7【OCaml】
2021/01/13
to be continued
2021/01/12
プログラミング言語その6【Kotlin】
2021/01/11
プログラミング言語その5【Swift】
2021/01/10
プログラミング言語その4【TypeScript】
2021/01/09
プログラミング言語その3【JavaScript】
2021/01/08
Comme d'habitude
2021/01/07
プログラミング言語その2【Java】
2021/01/06
プログラミング以前【Lisp】
2021/01/05
プログラミング言語その1【Objective-C】
2021/01/04
言語処理系入門
2021/01/03
ブログのようなもの
2021/01/02
Next.jsとPHPと私
2021/01/01
新年