Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SSG is a compiler
Search
sadnessOjisan
November 27, 2021
Technology
9.3k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SSG is a compiler
sadnessOjisan
November 27, 2021
More Decks by sadnessOjisan
See All by sadnessOjisan
Cloudflare Workers で Rust 選ぶ理由 is 何?
sadnessojisan
1
60
AIエージェントが動かないときの原因とその対処
sadnessojisan
2
130
React のルーター事情
sadnessojisan
1
620
PHPこそ OpenTelemetry が嬉しい
sadnessojisan
2
450
TypeScript、上達の瞬間
sadnessojisan
53
19k
フロントエンド・オブザーバビリティを支える要素技術を学ぼう
sadnessojisan
2
980
疎通2024
sadnessojisan
5
1.7k
BasicBasic認証
sadnessojisan
5
4.9k
ISUCON入門以前_ISUNARABE_LT#1
sadnessojisan
21
6.5k
Other Decks in Technology
See All in Technology
プロダクト開発から業務改善コンサルまで。事業全体へ「染み出す」ことで広がるエンジニアの可能性
ham0215
0
100
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
140
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
3
190
失敗を資産に変えるClaude Code
shinyasaita
0
440
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
1k
RSA暗号を手計算したくなること、ありますよね?? (20260615_orestudy6_rsa)
thousanda
0
240
新しいVibe Codingと”自走”について
watany
5
290
地球に⽣きるAI —GeoAIと「中間領域」— / AI Living on Earth — GeoAI and the “Intermediate Layer” —
ykiyota
0
280
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
130
LLMにもCAP定理があるという話
harukasakihara
0
290
EventBridge Connection
_kensh
5
690
自律型AIエージェントは何を破壊するのか
kojira
0
150
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Technical Leadership for Architectural Decision Making
baasie
3
400
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
The Cost Of JavaScript in 2023
addyosmani
55
10k
Un-Boring Meetings
codingconduct
0
310
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
250
So, you think you're a good person
axbom
PRO
2
2.1k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
Music & Morning Musume
bryan
47
7.2k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
First, design no harm
axbom
PRO
2
1.2k
Transcript
SSG is compiler Yuta Ide (@sadnessOjisan) JSConfJP2021
SSG is like a magic
None
None
None
None
SSG is your friend
Agenda 1. SSG is useful 2. Inside SSG 3. Look
back SSR
Is SSG only for Blog / LP / Q&A ?
言葉の定義 - SST - CSR - SSR - SSG
n番煎じな話なので詳細には立ち入りません。 それぞれのパフォーマンス上の特性は @takepepe さんの 「より速いWebを目指す Next.js」にまとまっており、こちらを参照してください。 また、これらは完全に分離できるものでもないことを断っておきます。 ex) template に react を CDN 経由で読み込んだものはどれ? https://speakerdeck.com/takefumiyoshii/nextjs-make-the-web-faster
SST: Server Side Templating - Server で HTML Template に値を埋め込み、HTML
を生成してクライアントへ返す - 素直な構成だと TTFB の遅さが問題になりがち - 一方で後述するCSRと比較し、通信の往復は減る
CSR: Client Side Rendering - サーバーから取得したデータを元に、コンテンツの 描画をクライアントサイドで完結させる - TTFB は速いが、LCP
を悪化させる要因を含む - コンテンツ描画のためにはクライアントでのデータ取得が 必要 - HTML / Styling を生成する仕事はクライアントが担う - コンテンツのアップデートにはHTMLを取得しなくて いいため SST より効率的になる
SSR: Server Side Rendering - サーバーからテンプレートに値が埋め込まれた HTMLを受け取る - クライアントでそのHTMLは hydration
される - hydration 後は CSR できる - SST における TTFB 周りのデメリットは引き継 ぐが、CSRの良いところを享受できる
(re)hydration - dehydration - JS世界にあるVDOM を HTML に変換する処理 -
SSR サーバーがクライアントにHTMLを返す - (re)hydration - HTML を JS の世界で使えるように戻す処理 - Client ライブラリが実行する
SSG: Static Site Generation - サーバーはリクエストに対してHTMLを返すだ け - HTMLをリクエストより前に生成しておく -
ビルド時の静的コンテンツとして固定されるデメ リットはある - しかしツールによっては hydration して dynamic な性質を取り込み、そのデメリットを回 避する
SSG: Static Site Generation - 歴史は長い - 2000年前半 Database Driven
な Site への対 抗として SSG が注目される - props: DBアクセスの削減 / TTFB の削減 - cons: ページ数に応じたビルドコスト - これまでに多くのツールが開発されている - 興味がある人は jamstack.org にあるまとめサイトを チェック https://jamstack.org/generators/
SSG: Static Site Generation 現代的なSSG 伝統的なSSG コンテンツから HTML を作る SSG
したものを hydration する
伝統的なSSG - テンプレートからHTMLファイルを生成するツール - Markdown ドキュメント、画像などのアセットを元にコンテンツページを作り出せ る - 任意の言語が利用できる
現代的なSSG - SSR FW や JS ツールチェインの上に作られる - hydration +
CSR の要素がある JS ツールチェインの上に作られることで、transpiler, bundler, compressor などの恩恵が受けられる ex) Next, Gatsby, Nuxt, …
hydration ≠ JS FW - wasm によって任意の言語で SSR + hydration
が可能 - 技術的には hydration 付きの SSG も可能である
SSG に対する批判 全てが静的に決まらないと使えない Twitter を SSG で作れますか? 現代的なSSGでCSRすれば対処できるケースも多い EC
の商品ページを静的生成、在庫はCSRで取得
Headless Comerce https://www.gatsbyjs.com/solutions/shopify
SSG に対する批判 全てが静的に決まらないと使えない Twitter を SSG で作れますか? 現代的なSSGでCSRすれば対処できるケースも多い EC
の商品ページを静的生成、在庫はCSRで取得 要件によってはCSRでも難しい C to C のECでページ作成が頻繁、通報された商品はページごとは消したい
Look back SSR later
Agenda 1. SSG is useful 2. Inside SSG 3. Look
back SSR
SSG is meta-compiler - Web performance 101 - 2017年の Gatsby
作者のブログ - Gatsby is meta-compiler - Gatsby は普通のサイトを速いサ イトへと変換する - Gatsby は webpack の設定ファイ ルを生成している https://www.gatsbyjs.com/blog/2017-09-13-why-is-gatsby-so-fast/
Let's dive into SSG
Chunk - SPA の問題の一つに bundle した JS が巨大過ぎるという問題 - 必要なページに必要なパーツさえあればいいよね
→ chunk という単位でJSを分割する
大量の script は chunk が理由 - 必要なページで、必要なchunk だけを使う - chunk
は bundler の設定で作 る
複雑な名前はchunkの規則 - ${key}-${hash} - app-44f67102fd3fe7d6ed63.js - component---src-pages-inde x-jsx-b3759d3c0476f9883dba. js
- commons-fa6c875ea4a0d1a31 7de.js - styles.80e97039b81d20471ead .css - hash があるとビルドごとに キャッシュを破棄できる
chunk の作り方 (webpack の場合) - chunk 名に対して条件を書く - 条件設定の指針 -
ページごとに分ける - 共通ライブラリをくくり出す - 詳しくは @mizchi さんの「webpack chunk 最適 テク ニック」 https://qiita.com/mizchi/items/418be9abee5f785696f0
Gatsbyはどのような chunk か - `framework-${hash}` - React などの明らかにどのコンポーネントからも使うライブラリを共通の chunk にまとめる
Gatsbyはどのような chunk か - `lib-${hash}` - module が 160kb を超えると別
chunk
Gatsbyはどのような chunk か - ページごとに chunk - 共通モジュールは chunk -
重いライブラリは chunk - スタイリング系もchunk Improved Next.js and Gatsby page load performance with granular chunking https://web.dev/granular-chunking-nextjs/
None
navigate - 現代的な SSG では CSR として遷移できる - <a />
ではなく <Link /> - ex) @gatsby/reach-router - 遷移先の chunk が必要
prefetch - resource の先読み - A から B に遷移する前に B
の chunk があれば即座に遷移可能 - Gatsby の場合、<Link /> に hover したら chunk を取ってこれる
Image optimaization - ビルド時に画像とHTMLを最適化 - Size, Resolution - Tag: picture,
source, lazy load - Traced SVG: 小サイズのSVG placeholder を生成、画 像ロード時に差し替え - JSConfJP の Speaker が分かりやすい - https://jsconf.jp/2021/speakers/
Zero Runtime CSS in JS - VDOMからのスタイル生成はクライアントで行わ れる - React
の style - CSS in JS lib: (ex) styled-component, emotion, - LCP に影響あり - とはいえほとんどの場合は大丈夫 - ビルド時にCSSをHTMLに埋め込む - zero runtime xxx が流行 “静的に埋め込めるものは事 前に埋め込んでしまおう” - ex) linaria, vanila-extract
Gatsby での Zero Runtime CSS in JS の実現 - ビルド時に勝手に
HTML に埋め込んでくれる (便利) - ただしランタイムでCSSを書き換える時は、CSS in JS ライブラリ環境下では対応するプラグイン が必要 - gatsby-plugin-emotion など
How about Performance
手書きHTMLが最速? - 個人的な誤解: React / Next / Gatsby を使えば早くなる -
They say “diffing”, “blazing fast”, … - 駆け出しエンジニア時代、SPA はすごいことをしているという誤解をする - 【翻訳】 2016年にJavaScriptを学んでどう感じたか ← これめちゃくちゃ面白い - https://www.fendo181.me/entry/2016/10/26/172404 - 冷静に考えると・・・ - 差分検知なんぞせず、手で直接実DOMを部分更新した方がエコでは? - そもそもランタイムにReactライブラリを含めない方がエコでは?
Handwritten VS Gatsby
Handwritten must have advantage in simple condition
<p>Hello World</p> だけを比較 手書きHTML Gatsby ランタイムのJSが遅れるものの、FCPには影響がない。
手書きが勝てない理由, FCP に影響がない理由 - SSG (=静的化)しているのだから HTML に支払うコストは同じになる - ランタイムが膨らむと言っても
chunk へのリンクが挟まれているだけで、それは async load されるのでブロッキングされない - Gatsby のビルドは自然と HTML が minify される
Gatsby に嫌がらせをしてみた - Gatsby の遷移は CSR としての遷移 - つまり、遷移を妨害すれば良い -
遷移先の chunk を巨大にする - 嫌がらせ chunk が分離されないように 1page component にベタ書く - 巨大 prefetch 中に遷移する 20MB のDOM要素を用意しました <p>heavy_heavy_heavy_…</p>
Gatsby に嫌がらせをしてみた 手書きHTMLなら、HTMLごと遷移すれ ば先頭の表示はされる Gatsby の場合、固まる やったね!
あ ほ く さ
SSGした方が良い? - SPA (1HTML しかない CSR) に対してはライブラリの分の容量分のアドバンテー ジがある - SSG
に対しては、SSG 側もライブラリ分の容量を HTML からは削るので差が出 にくい - ランタイムで動かしたいJSがあっても(ex カルーセル、モーダル)、別チャンクに 切り出せば HTML を読み込むコストとしての差は出ない - 別コンポーネントに分けて、2カ所以上から読み込む SSGした方が良い
Agenda 1. SSG is useful 2. Inside SSG 3. Look
back SSR
SSR, CSR の弱点、なぜ SSG は速いのか - 一番効いてるのは事前生成によるTTFBの削減 - SSR はここが弱点
- I/O - CPU負荷
SSG の弱点 大量コンテンツのビルド Incremental Build コンテンツの追加・削除・編集 ISR DSG SSR +
CDN 弱点 対策
Incremental Build - Gatsby のビルドモードの一つ - ビルド時の cache を使って、次回は差分のみをビルド -
Gatsby Cloud でしか使えなかったが v3 でオープンに - とはいえ問題が根本的に解消はされない - うっかり cache を消した時のリカバリは? - cache 全体に影響があるような変更が入ると? - 運用者目線ではすぐにデプロイし直せる保証が欲しい - DSG (後述)
DSG: Deferred Static Generation - Gatsby v4~ - ビルドタイミングを制御する機能 -
静的ビルドするパスを宣言できる - ビルド時に生成しなかったページはユーザーの アクセス時に作られる = SSR - CDNレイヤーにcache - アクセスされたページの HTML が static/ フォ ルダに作られるわけではない - Gatsby Cloud を使う必要がある - 使わなくても良い方法があるが、それは後述す る方法と同じやり方 https://www.gatsbyjs.com/docs/conceptual/rendering-options/
ISR: Incremental Static Regeneration - NextJS のモードの一つ - SSR と
SSG のいいところ取り - 一度 SSR した HTML をキャッシュし、次回のアクセスからそれを返す - 処理軽減 - IO削減 - stale な cache を返しつつ cache を fresh にできる - (基本的には)Vercel 環境でしか動かせない
That’s lock-in
lock-in が嫌われている気がする - Vercel や Gatsby が素晴らしい機能を出すたびに lock-in が心配される -
個人的には 「Vercel に乗っかりなよ」とは思うが、lock-in されたくない気持 ちも理解できる - よし、内製しよう - DSG / ISR のような動作は CDN で担保する - SSR FW を自作すればいい
SSR + CDN - SSR した HTML を CDN に
cache - 一番素直で FW や Hosting 環境にし ばられないやり方 - cache の制御もしやすい - stale-while-revalidate => ISR - vary - dynamic cache purging
FW を使わない SSR -とある実装を参考に- - Best practice component library
を作っておく - ビルド時にクライアントコードの最適化 - chunk の作成 - linaria の実行 - NodeJS サーバーのエンドポイントで リクエストを待ち受ける - (p) react をサーバーで実行して HTML を作成 - cache control header を設定して返す 意外とシンプル preactとfastifyでSSR https://zenn.dev/takurinton/articles/4 c8625a43f024b
FW を使わないメリット - ランタイムライブラリの選択が自由 - 不都合なく preact が使える -
_app.js, gatsby-browser.js より細かい粒度で共通設定を書ける - ビルドチェインの拡張が容易 - React app 以外のコードをビルド、SSR時に script tag で挟み込むといったことがやりや すい - 1 サービスを複数チームで育てる時に管理しやすい - partial hydration - とはいえ Astro, Next12 も凄い!
FW を使わないデメリット、その指摘 - FW を作ることに消耗したくない、案件を進めたい - Next の完コピを目指すと大変だけど、ただのSSRサーバーを作るだけならそこまでコスト はない -
バックエンドの扱いは慣れていない - cache hit ratio を上げる ※ と、ここまで偉そうに話しましたがほとんどが知人の実装やおかげです
まとめ - 現代的な SSG は dynamic な要件に対応できる - SSG が内部でしていることはページの事前生成とパフォーマンスの最適化
- SSG の辛さへの回答として、SSR で HTML を Generate して CDN で Cache - FW や PFM へのロックインが気になるなら自作できる