Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RSCの時代にReactとフレームワークの境界を探る
Search
uhyo
September 06, 2025
Technology
6k
15
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RSCの時代にReactとフレームワークの境界を探る
2025-09-06 フロントエンドカンファレンス北海道2025
uhyo
September 06, 2025
More Decks by uhyo
See All by uhyo
Content Mapper APIの応用例~CSS Modules、言語ファイル~
uhyo
2
550
Reactの設計論
uhyo
26
18k
型があると何が嬉しいか
uhyo
3
170
Baseline対応のDOMの型定義を作った
uhyo
3
1k
AIのReact習熟度を測る
uhyo
2
1.1k
React、まだ楽しくて草
uhyo
7
5.3k
TypeScript 7.0の現在地と備え方
uhyo
6
3.9k
React 19時代のコンポーネント設計ベストプラクティス
uhyo
20
11k
型定義でAIと会話する:型を通じてAIに意図を伝えるテクニック
uhyo
1
130
Other Decks in Technology
See All in Technology
AI Search (Foundry IQ) におけるRAGデータの準備と配置
ryomaru0825
1
140
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
190
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
220
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
1
130
AI AgentによるEmbedded SREの取り組み
tgidgd
1
330
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
780
レガシーコードに対する loop engineering的なAI開発プロセス導入について
kubell_hr
0
140
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
200
[FECONF-2026] 신대륙을 향한 카카오페이증권 프론트엔드 항해기 (이주승)
l1ghthouse
0
380
re:Invent2026 事前勉強会 歴史と愉しみ方10分LT編
toshi_atsumi
0
110
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
360
Patterns in AI Driven Software Development
akosma
PRO
0
470
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.4k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
600
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
670
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
970
Odyssey Design
rkendrick25
PRO
2
920
HDC tutorial
michielstock
2
1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
620
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Transcript
RSCの時代にReactとフレームワーク の境界を探る 2025-09-06 フロントエンドカンファレンス北海道2025
発表者紹介 uhyo 株式会社カオナビ フロントエンドエキスパート ぎりぎりReactのクラスコンポーネントを 使ったことがある。 2
React Server Components (RSC) React 19で安定化されたReactの機能。 従来のコンポーネントよりも前の別段階で レンダリングされる。 別段階は、リクエスト時のサーバー側だったり、 ビルド時だったりする。
3
RSCを使う方法 RSCはReact用フレームワークと一緒に使用する。 •Next.js RSC対応の先駆者、webpackベースの重量級 •@lazarv/react-server Viteベースの軽量フレームワーク •React Router これもViteベース(現在はプレビュー機能) •Waku
やっぱりViteベースのミニマルなフレームワーク など 4
疑問 フレームワークを介さないと使えないのに、 RSCは本当にReactの機能なの? フレームワークとRSCの境界はどこにあるの? 5
答え① 複数の異なるフレームワークで利用できるのは、 RSCがReact本体の機能だからですよね。 でも、 RSCのやりたいことを実現するために フレームワークの助けが必要だから こうなっています。 6
This Talk RSCのやりたいこととはどのようなことで、 フレームワークがそれをどう助けているのかを 解説します。 7
でもフレームワーク無しで RSCを動かす 8
フレームワーク無しでRSCを動かす RSCを“動かす”だけなら、フレームワーク無しで できる。 しかし、我々が良く知るRSCとは別物になる。 ←このZenn本で詳しく解説しています 9
我々が良く知るRSC 10 import { Client } from “./client.tsx”; export const
SC = () => { return ( <div> <Client /> </div> ); }; server.tsx “use client”; export const Client = () => { return ( <p>client!</p> ); }; client.tsx import サーバーからクライアントをimportしてコンポーネントを使用できる。
フレームワーク無しのRSC 11 const Client = { /* 省略 */ };
export const SC = () => { return ( <div> <Client /> </div> ); }; server.tsx export const Client = () => { return ( <p>client!</p> ); }; client.tsx 独立 サーバーとクライアントは独立した、別々のプログラムになる。
フレームワーク無しのRSC 12 const Client = { /* 省略 */ };
export const SC = () => { return ( <div> <Client /> </div> ); }; server.tsx server.tsxはサーバー側用のReactランタイムで 実行。Clientはサーバー側でレンダリングしない。 Clientは「Clientというコンポーネント」の ままクライアント側に送られる。 クライアント側がClientのレンダリングを 担当。
フレームワーク無しのRSC 13 export const Client = () => { return
( <p>client!</p> ); }; client.tsx client.tsxはクライアント用のReactランタイムで 実行。 SC部分がただのHTMLとなった状態で クライアント側のランタイムに渡される。 こちらはClientの定義を知っており、 Clientをレンダリングできる。
フレームワーク無しのRSCの問題 14 const Client = { /* 省略 */ };
export const SC = () => { return ( <div> <Client /> </div> ); }; server.tsx export const Client = () => { return ( <p>client!</p> ); }; client.tsx 別々のプログラムで2つの定義を同期させる必要がある。非常にDX悪い。
フレームワークがやっている こと 15
RSCでフレームワークがやっていること importでサーバーとクライアントが繋がった Reactプログラムを、 「サーバー側用」と「クライアント用」の 2つの別々のプログラムへとビルドする。 ビルド サーバー 用 クライ アント用
RSCでフレームワークがやっていること このようなビルド工程はバンドラがやっている ことの応用である。 そのため、フレームワークでも、RSC対応の根本 部分はバンドラのプラグインとして実装される。 17
Reactフレームワークの構造 18 サーバー用 Reactランタイム クライアント用 Reactランタイム Reactの機能 バンドラの機能 RSC規約に従った サーバー・クライアント分割
及びビルド フレームワーク の個性 ルーティング キャッシュ 最適化 など バンドラプラグイン
RSC規約とは “use client” でクライアントの世界への入り口を 示すのがRSCの規約。 Reactフレームワークは同じRSC規約をサポート している。 サーバーとクライアントを「1つのプログラム」に 統合するために必要。 19
RSC規約とバンドラの関係 “use client” のようなディレクティブは、 JavaScriptの言語仕様上は意味のない記述。 (”use strict”だけは例外) よって、RSCをサポートするためには バンドラのようなビルドツールが必須。 20
バンドラプラグインの実装 RSC規約に基づいた変換例を見てみよう。 今回は @vitejs/plugin-rsc を対象にする。 21 ビルド サーバー 用 クライ
アント用
サーバー用のビルド方法 サーバー用モジュールからクライアント用ファイ ルをimportする際に、クライアント用モジュール をスタブ的なものに置き換える。 22 置き換え 本当のクライア ント用コードと 切り離される
置き換えの実例 置き換え前(実際のクライアント用モジュール) 'use client'; export function Greet({ name }: {
name: string }) { return <>Hello {name}</>; } 23 Waku v0.25.0 のソースコードから一部改変して引用(次のスライドも同じ) https://github.com/wakujs/waku/blob/473d481f0d926e05c9b0b8af5d2b777ff47eb70b/packages /waku/tests/vite-plugin-rsc-transform-internals.test.ts
置き換えの実例 置き換え後(サーバー側から見える同モジュール) import { registerClientReference } from 'react-server-dom-webpack/server.edge’; export const
Greet = registerClientReference(()=>{ throw new Error('It is not possible to invoke a client function from the server: /src/App.tsx#Greet'); }, '/src/App.tsx', 'Greet'); 24
置き換えで何をやっているか 実際のクライアント側モジュールでexportされていた ものに対応するクライアントへの参照を、React本体の 機能として用意されているregisterClientReferenceを 使って用意している。 (クライアントへの参照の実態はファイル名とexport名) 25 本物ではなく参照
置き換えによるRSCの動作 Reactのサーバー側ランタイムは クライアントへの参照を認識し、残したままで レンダリングを行う。 クライアント側では、残された参照を解決することが でき、レンダリングの続きを行うことができる。 26
バンドラプラグインの実装 @vitejs/plugin-rscのソースコードを見る。 Wakuからも使用されている、Vite公式のRSC用 プラグイン。 引用元: https://github.com/vitejs/vite-plugin- react/blob/b81bf6ac8a273855c5e9f39d71a32d76fd31b61c/packages/plugin-rsc/src/plugin.ts 27
バンドラプラグインの実装① { name: 'rsc:use-client', async transform(code, id) { /* 中略
*/ const ast = await parseAstAsync(code) if (!hasDirective(ast.body, 'use client')) { delete manager.clientReferenceMetaMap[id] return } /* 以下略 */ 28 ‘use client’ を持つ ファイルが変換対象
バンドラプラグインの実装② const result = transformDirectiveProxyExport_(ast, { /* 省略 */ runtime:
(name, meta) => { let proxyValue = /* 省略 */ return ( `$$ReactServer.registerClientReference(` + ` ${proxyValue},` + ` ${JSON.stringify(referenceKey)},` + ` ${JSON.stringify(name)})` ) }, 29 各exportを registerClientRefere nce呼び出しに変換
実装を見て分かったこと プラグインは、“use client”を頼りに クライアントモジュールをサーバー向けに変換し、 サーバー用のビルドを行う。 バンドラはサーバーとクライアントの境目だけ変換 すればいいため、バンドラに寄り添った規約に なっている。 (実際は開発サーバーとか色々考慮して変換している) 30
気になる人は 探せば“use server”に関連した変換などもある。 実装の側からRSCについて理解したい人は、 プラグインの実装を読んでみよう。 31
結局、Reactとフレーム ワークの境目はどこ? 32
疑問(再掲) フレームワークを介さないと使えないのに、 RSCは本当にReactの機能なの? フレームワークとRSCの境界はどこにあるの? 33
Reactフレームワークの構造(再掲) 34 サーバー用 Reactランタイム クライアント用 Reactランタイム Reactの機能 バンドラの機能 RSC規約に従った サーバー・クライアント分割
及びビルド フレームワーク の個性 ルーティング キャッシュ 最適化 など バンドラプラグイン
答え②: 境目はこんな感じ 35 サーバー用 Reactランタイム クライアント用 Reactランタイム Reactの機能 バンドラの機能 サーバー・クライアント分割とビルド
RSC規約 フレームワーク の個性 ルーティング キャッシュ 最適化 など バンドラプラグイン
Reactとフレームワークの境目 Reactは、ランタイムのAPIを提供する。 フレームワークは、ReactのAPIを使って サーバーとクライアントを実装する。 加えて、ReactはRSC規約を定義する。 その規約を実装するのはフレームワーク。
ポイント RSC規約は、定義する主体と実装する主体が 異なる。 React側で規約を定義している理由は、おそらく フレームワークを問わず共通の開発体験を保証 するためだろう。 (同じWeb標準を複数ブラウザが実装しているのに近いかも)
まとめ RSCは、”use client”のような規約をReactが 規定しフレームワークが実装している。 実際に、Next.js、@vitejs/plugin-rsc、 @lazarv/react-serverなどがRSC規約を実装し、 RSCをサポートしている。 RSC規約は通常、バンドラプラグインとして実装 される。 38