※クラシックSSR
SSR = サーバーサイドレンダリング
リンクをクリックするたびにサーバーサイドで
HTMLをレンダリングする
後述するSSRと区別
生成されるページ自体は静的
Slide 9
Slide 9 text
HTML
M
C
V
<%= @user.name %>
HTML = Template (data)
Web MVCフレームワーク
APサーバ
ブラウザ
DB
data
テンプレート
Slide 10
Slide 10 text
Web MVCフレームワーク
サーバーサイドでは MVC を利用
Ruby on Rails, Laravel, Spring, etc.
View には「テンプレート」を利用
例: ERB, Blade, JSP, etc.
HTML = Template (data)
リクエスト毎にページ全体をレンダリングして返す
React
The library for web and native user interfaces
Web とネイティブユーザインターフェースのためのライブラリ
開発元は Meta (旧 Facebook)
フロントエンド界の(現)覇者
語りたいことは色々あるが、結局は以下の 2 つに集約
される
コンポーネント指向
宣言的 UI ⇔ UI = f (state)
Slide 33
Slide 33 text
コンポーネント指向
MV*
DOM
Controller
イベント
View
コンテンツ
Model
状態
更新要求
変更通知
React
DOM
ロジック
ロジック
状態
コンテンツ
Component
ロジック
状態
コンテンツ
Component
ロジック
状態
コンテンツ
Component
更新
更新
子コンポーネント
(複数可)
仮想 DOM
React のメンタルモデル
「変化の過程」ではなく「結果」を記述(=宣言的)
毎回新規にレンダリングするのに近い。面倒な DOM 更新は React 側が担う
毎回全更新だと遅い
そこで登場するのが「仮想 DOM」
DOM の代わりに軽量なJSオブジェクトで仮想 DOM 構築
VDOM = f (state)
差分更新(Reconciliation)
前回レンダリング時と新しい仮想 DOM を比較 → 実DOM へ反映
Slide 40
Slide 40 text
※仮想 DOMの補足
HTML =
DOM API = document.createElement("div")
仮想 DOM 構造体 = React.createElement("div")
仮想 DOM アルゴリズムの実行
=ReactDOM.render(, el)
前後の 2 つの木構造の比較することで、その差分を埋める操作を
自動的に導出できるはず、というのがスタート地点
静的
HTML
JS エンジン
SPA の課題①:クローラー
クローラー Web サーバ
コンテンツとしては空
コンテンツがないから
インデックスできない
JS に対応した
クローラー
インデックスが遅れて
しまう!
Slide 43
Slide 43 text
静的
HTML
DOM
JS
SPA の課題②:初期表示
Web サーバ
ブラウザ
レンダリング
JSON
API サーバ
DB
(CSR)
コンテンツとしては空
(SSR 不要)
コンテンツは
空
コンテンツは
存在
LCP が遅
い!
Slide 44
Slide 44 text
※ Core Web Vitals
2.5 s 4 s 100 ms 300 ms 0.1 0.25
初期画面のうち、最大の領
域を占めるコンテンツが表
示されるまでの時間
Large Contentful Painting First Input Delay
初回のユーザー操作・入力
が可能になるまでの時間
視覚的な安定性を計測する
ためのレイアウトシフト数
(いわゆるガタツキ)
Cumlative Layout Shift
LCP FID CLS
Slide 45
Slide 45 text
No content
Slide 46
Slide 46 text
SPA の課題
MPA (クラシック SSR)からの移行コスト
SEO 対策が困難
10 年代半ばのクローラーは JS非サポート
現在は Google など JS サポートクローラーあるが...
インデックス遅い
OGP 対応困難・通信環境に依存
初期表示が遅い(LCP / FCP)
最初に読み込まれる HTML が空
Slide 47
Slide 47 text
HTML
DOM
JS
JS
Pre-rendering
Node.js
ブラウザ
レンダリング
JSON
API サーバ
DB
(CSR)
コンテンツを含む
コンテンツあり
インタラクション
LCP が速い
INP が遅
い!
JSON
同じコードベース
Slide 48
Slide 48 text
SPA(CSR + Pre-rendering)
最初に配信される HTML にコンテンツをPre-render
Pre-rendering には CSR と同じコードベースを利用
例: React, VueJS, etc.
Pre-rendering には Node.js を用いる
renderToString()。DOM 操作の代わりに HTML 文字列
「初期表示が遅い」問題を解決
初期表示後は通常通り CSR と同じように動作
Slide 49
Slide 49 text
Hydration
HTML 描画 JS の読み込み Hydration
Hydration とは、SSRで生成された静的なHTMLに
Reactが再度アタッチするプロセス
Next.js の登場
The React Framework for the Web
Web のための React フレームワーク
開発元は Vercel
火曜に障害起こしがちなのなんとかしてくれ
フルスタック FW 界を統一しようとしてる
Rails などと同じ土俵で戦っている
当初は SSR を提供するだけのものだった
今では Zero Config や Routing など React がカバーしきれない部
分を補完
Slide 52
Slide 52 text
「TypeScript と React / Next.js でつくる実践 Web アプリケーション開発」から引用
Server Component
+
Client Component
HTML
+
Client Component
HTML
+
JavaScript
Client
(ブラウザ)
React Server Components
Server
Stage0
Stage1
実態としては
仮想 DOM をシリ
アライズしたもの