[note] Rendering Pattern (feat Next.js)

SSG (Static Site Generate)
「畫面渲染」和「資料拉取」都在 build time 是就都出來完,並變成「靜態檔案」,並**不是在 sever 收到 request 後才開始動作**。
- TTFB, FCP, TTI 較好
- 當頁面變的越來越多時,打包也會需要更長的時間
- 資料在 build time 時就已經寫死,沒辦法動態更新
ISR (Incremental Static Regeneration)
可以視為 SSG 的一種特例,差別在於可以設定靜態檔案過期的時間(revalidate),一旦靜態檔案過期,就會觸發 server 重新 build 一次該靜態頁面。
- 保有 SSG 的好處,但又能夠在一定時間後更新頁面
CSR (Client Side Rendering)
「畫面渲染(包括 HTML 和事件處理)」和「資料拉取」都從 client 處理
- 專案越大,使用者要下載 bundle JS files 也越大
- 當 bundle size 越大時,檔案下載完成前使用者看到的都是空白畫面(或 loading),可能導致 FCP, LCP 和 TTI 都變差
- 畫面上的不同區塊不用一次全部呈現,可以逐塊顯示
SSR (Server Side Rendering)
想解決的問題
- CSR 要下載很大的一包 JavaScript 後使用者才能看到內容(很久的 loading 畫面)
- 改善 FCP 和 LCP
未解決的問題
- TTFB 較差,畫面出現了但使用者仍能無法互動:仍然需要等待 JavaScript 下載、並執行 hydration 後,使用者才能和畫面上的元件互動
重要名詞
- Pre-rendering:指 server 端預先把 client 請求的 HTML 給產生出來,並回傳給 client,然而此時整個畫面因為還沒註冊事件,所以是不具有互動性的。Pre-rendering 又可以分成
Static Generation和Server-side Rendering這兩種。 - Hydrate:主要的動作是將 event handlers 綁定在 DOM 元素上,並且準備好對這些事件做反應;其次則是要強化 server rendered 的頁面,例如,自動播放影片、訂閱一些需 live 顯示的資料等等。
實際上,Pre-rendering 分成兩種形式,分別式 **Static Generation(SSG / Static Site Generation)**和 Server-side Rendering(SSR),這兩者間最重要的差別是「靜態頁面(HTML)產生的時間點」。
- Static Generation:靜態頁面是在 build-time 時就產生,伺服器收到 request 時重複使用這些已經生成好的靜態頁面。
- Server-side Rendering:伺服器每次收到請求時在產生對應的靜態頁面。