Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webレンダリング技術の進化と課題

Jeongmin LEE
February 09, 2025
38

 Webレンダリング技術の進化と課題

Jeongmin LEE

February 09, 2025
Tweet

Transcript

  1. 1991年、WEBが誕生する CERN (欧州原子核研究機構) 所属科学者の Tim Berners-Lee が初めて WWW、ブラウザ、HTTP などを考案。 彼は研究所内の数多くのドキュメントを共有する方法を探してたと知られてる

    世界初のWEBサイト(復元したものだけど) テキストに資料のリンクが付与されたハイパテキストの登場 HTML (HyperText Markup Language) の名前もここからきてる
  2. これがページ遷移する度に起きる Aページ開く ① Aページ表示 ③ Bページ表示 ⑤ Cページ表示 ⑦ Dページ表示

    ② Bページ開く ④ Cページ開く ⑥ Dページ開く ページ作る ページ作る ページ作る ページ作る 毎度新しいページ(HTML)作る = 複数ページのアプリケーション
  3. MPA は基本的に SSR SSR とは、Server side rendering (= サーバー側のレンダリング) の略称。

    クライアントはもらった HTMLを表示するだけ PHP、Java などがよく使われていた
  4. 2005年、Ajax のデカいインパクト Ajax は Asynchronous JavaScript and XML (=非同期 JavaScript

    と XML) の略称 ウェブアプリケーションが非同期 HTTP リクエストを行うことでサーバーからコンテンツを取得し、 その新しいコンテンツを使用してページの関連部分を更新する = 更新が必要な部分のみがリクエストされるため、ページの応答性が向上
  5. 2005年、Ajax のデカいインパクト Google Map をドラッグしたらその部分だけ読み込むあれ Google が Google Map に

    Ajax(Asynchronous JavaScript and XML) を採用 Ajaxのおかげで、画面遷移せず画面の一部だけを更新できる
  6. これが初期アクセスのときだけ起きる Aページ開く ① Aページ表示 ③ Bページ表示 ⑤ Cページ表示 ⑦ Dページ表示

    ② Bページ開く ④ Cページ開く ⑥ Dページ開く クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画
  7. これが初期アクセスのときだけ起きる Aページ開く ① Aページ表示 ③ Bページ表示 ⑤ Cページ表示 ⑦ Dページ表示

    ② Bページ開く ④ Cページ開く ⑥ Dページ開く クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 最初だけ新しいページ(HTML)作る = 単一ページのアプリケーション (空の)ページ作る *この時点でアプリケーション全体に必要な  すべてのコードをクライアントに送信する クライアントのJSが 新しい画面描画
  8. 初期の SPA は基本的に CSR CSR とは、Client side rendering (= クライアント側のレンダリング)

    の略称。 画面を描画するのはクライアントで 読み込まれたJavascript *SPA実装のための代表的なフレームワークは、  AngularJS(2010)、React (2013)、Vue.js(2014) などがある
  9. SPA の課題 (1) 初アクセス (空の)HTML ダウンロード Javascript ダウンロード Javascript 実行

    APIデータ フェッチ 1番時間かかる (アプリ全体のコードをこのときダウンロードするから&JSは重いから) 初アクセス *MPAの場合 HTML ダウンロード 初回ロードが遅い
  10. 初アクセス *MPAの場合 HTML ダウンロード SPA の課題 (2) 初アクセス (空の)HTML ダウンロード

    Javascript ダウンロード Javascript 実行 APIデータ フェッチ SEO に弱い
  11. クローラーは HTML の内容を取得して分析する <!DOCTYPE html> <html> <head> <title>SPA Example</title> </head>

    <body> <div id="root"></div> <!-- 空のコンテナ --> <script src="app.js"></script> <!-- JSで動的にコンテンツを描画 --> </body> </html> ↓クローラーから見たSPAのHTML SPA の課題 (2)
  12. クローラーは HTML の内容を取得して分析する <!DOCTYPE html> <html> <head> <title>SPA Example</title> </head>

    <body> <div id="root"></div> <!-- 空のコンテナ --> <script src="app.js"></script> <!-- JSで動的にコンテンツを描画 --> </body> </html> ↓クローラーから見たSPAのHTML SPA の課題 (2) そしてクローラーは判断する… 「このページは中身がない!」
  13. Next.js の Pre-rendering 初期SPAの課題: 初回ロードが遅い、SEOに弱い この課題を解決するため、 Next.js は基本的にすべてのページを Pre-rendering する

    = クライエント側の JS がレンダリングする代わりに、各ページに対して HTML を予め作っておく *pre = 事前に
  14. Next.js の Pre-rendering ⑤ JSON 送信 ⑥ HTML を作る ⑦

    HTML、JS送信 ⑨ JS実行 ⑧ HTML表示 空のHTMLではなく、 ページ表示に必要な HTML を作る この時点では JS が実行されてない ので、インタラクティブではない ここでインタラクティブになる EX) ボタン押してもなにも起きない SPAだけど、サーバーでHTMLを作成してクライアントに送信する
  15. ⑤ JSON 送信 ⑥ HTML を作る ⑦ HTML、JS送信 ⑨ JS実行

    ⑧ HTML表示 Pre-rendering がある場合 ⑤ JSON 送信 ⑦ 空のHTML、 JS送信 ⑧ JS実行 ⑧ 空のHTML表示 Pre-rendering がない場合(素のReact)
  16. Hydration という概念 ⑦ HTML、JS送信 ⑨ JS実行 ⑧ HTML表示 Javascript を実行してページをインタラク

    ティブにすることを Hydration と言う *Hydration は水分供給という意味 (ドライな HTML に水分を供給する、で覚えたらいいかもしれない) ⑤ JSON 送信 ⑥ HTML を作る
  17. Pre-rendering(= サーバー側でHTMLを生成する) には 2 種類がある • SG(Static Generation、静的生成) ◦ (後発!)

    ISR(Incremental Static Regeneration、段階的な静的再生成) • SSR(Server-side Rendering、サーバー側のレンダリング)
  18. ISR(Incremental Static Regeneration、段階的な静的再生成) 2020年、SG の一種として後発で新しく登場 SG と同様に、HTML を事前に生成するけど、完全固定ではなく一定時間後に更新可能 1. 静的ページが生成され、CDN

    にキャッシュされる 2. 指定時間以内にリクエストが来たら、キャッシュ済みのページを返す 3. 指定時間以降にリクエストが来たら、キャッシュ済みのページを返す ただ、裏では新しい静的ページ生成して、キャッシュを更新する 4. 次回のリクエストには更新されたキャッシュから配信する ISRの動き 動的なコンテンツを含むページも 静的ページとしてCDNにキャッシュすることが可能
  19. SG vs SSR、どう使い分ける? • SG はビルド時にHTML生成(=ビルド時にもうページが完成してる) ◦ ページのレンダリングに必要なデータがビルド時点で利用できる場合 ◦ ページが頻繁に更新されない場合

    ◦ 例)ニュースページ、FAQページなど • SSR はリクエストごとにHTML生成(=リクエストがないとページを作れない) ◦ リクエスト時にしかわからない情報に依存するページをレンダリングする場合 ◦ ページが頻繁に更新され、常に最新の情報を表示する場合 ◦ 例)ログイン後のマイページ、検索結果ページなど
  20. Next.js の Pre-rendering が解決した課題 (1) 初期表示速度の改善 初アクセス (空の)HTML ダウンロード Javascript

    ダウンロード Javascript 実行 APIデータ フェッチ 初アクセス HTML ダウンロード Javascript ダウンロード Javascript 実行 APIデータ フェッチ *pre-rendering のない SPA この時点でページのコンテンツが見れる
  21. (注意) Next.js の Link で遷移しないと、SPAの良さが活かせない * <Link> で遷移する場合 * HTML

    の <a> で遷移する場合 クライアントサイドの Javascript で 画面遷移するため、フルリロードせず遷移する 通常のリンクなので、サーバーから新しいHTML 取得する(=フルリロードが発生する)
  22. Next.js の Pre-rendering が解決した課題 (2) SEO改善 初アクセス (空の)HTML ダウンロード Javascript

    ダウンロード Javascript 実行 APIデータ フェッチ 初アクセス HTML ダウンロード Javascript ダウンロード Javascript 実行 APIデータ フェッチ *pre-rendering のない SPA 空のHTMLではないので、クローラーが ちゃんとクローリングできる
  23. Next.js の SSR の課題 (1) HTML作るに時間かかる & サーバーに負荷がかかる(サービスの規模が大きいほど課題感がたかまる) リクエストの度にHTML作る =

    HTML作ってる間は画面が表示されない = サーバーが重労働 *ここで必要なデータをフェッチして、  それをもとにHTMLをつくる
  24. HTML 描画から Javascript 実行まで時間かかる (見えてるけど押せないんだが?の時間がある) Next.js の SSR の課題 (2)

    HTML表示 インタラクティブになる コンテンツが見えるまでは早くなったけど、 TTI (Time to interactive) になるまで時間かかる
  25. • アプリケーションの種類 ◦ MPA (Multiple Page Application) ◦ SPA(Single Page

    Application) • レンダリングの手法 ◦ SSR(Server Side Rendering) ◦ CSR (Client Side Rendering) • Next.js の Pre-rendering の種類 ◦ SG (Static Generation) ▪ ISR (Incremental Static Regeneration) ◦ SSR(Server Side Rendering) 用語整理
  26. - zenn, 「【レンダリング大全】CSR, SSR, SPA, MPA, PPRの意味、そもそもレンダリングとは【2025 年始】」, https://zenn.dev/txxm/articles/f04b21949ddab3 -

    react.dev, 「Render and Commit」, https://react.dev/learn/render-and-commit - nextjs.org, 「getStaticProps」, https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props - nextjs.org, 「getServerSideProps」, https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props - zenn, 「Next.jsのISRで動的コンテンツをキャッシュするときの戦略」, https://zenn.dev/catnose99/articles/8bed46fb271e44 - developer.mozilla.org, 「Ajax」, https://developer.mozilla.org/ja/docs/Glossary/AJAX - speakerdeck, 「MPA化するSPAとSPA化するMPA」, https://speakerdeck.com/yosuke_furukawa/mpahua-suruspatospahua-surumpa 参考資料