結論先講

沒有「最好的渲染策略」,只有「最適合你頁面類型的渲染策略」。 CSR 適合互動為主的 SPA,SSR 適合 SEO + 首屏速度兼顧,Islands 適合靜態內容多、互動少的內容型網站。選錯渲染策略,效能反而比不選更差。


三種策略一句話

策略一句話首屏來源
CSR瀏覽器下載 JS → 執行 → 產生 HTML全靠瀏覽器
SSRServer 產生 HTML → 瀏覽器收到就能看 → 再載入 JS 做互動Server 先畫
IslandsServer 產生靜態 HTML → 只有互動區塊載入 JS混合

我們測到了什麼

同一個 Todos 頁面的首屏速度

渲染方式框架LCP備註
CSRReact1.82s瀏覽器端渲染
CSRVue1.69s瀏覽器端渲染
CSRSvelte1.75s瀏覽器端渲染
CSRAngular2.10s瀏覽器端渲染
IslandsAstro-React2.50s+SSR + 局部 hydration
IslandsAstro-Vue2.60s+SSR + 局部 hydration

CSR 的 Vue 最快(1.69s),Islands 的 Astro 最慢(2.5s+)。

為什麼 Islands 比純 CSR 慢

直覺上,SSR 應該比 CSR 快——server 先畫好 HTML,瀏覽器收到就能看。但 Astro 的 Islands 在 Todos 頁面反而更慢,原因有三:

1. Hydration 成本

Astro 先在 server 渲染 HTML,傳給瀏覽器。瀏覽器收到 HTML 後,還需要「hydrate」——把 JavaScript 的事件綁定和狀態管理接上去。

CSR:  [下載 JS] → [執行 JS 產生 DOM] → 可互動
      ─────────────1.82 秒──────────────

Islands: [下載 HTML] → [顯示] → [下載 JS] → [Hydrate] → 可互動
         ───────0.5s──── ─────────2.0s───────── = 2.5s

看起來 Islands 分成兩階段:先看到內容(0.5s),再等互動(2.0s)。但 Lighthouse 的 LCP 看的是「最大內容繪製」,而 Todos 頁面的「最大內容」就是那個列表——在 hydration 完成前,列表是靜態的(不能勾選、不能新增)。

2. Todos 頁面全部都是互動元件

Islands 的設計是「大部分是靜態 HTML,少部分是互動島嶼」。但 Todos 頁面的每一行都是互動元件(勾選、刪除)。等於整個頁面都是「島嶼」——你付出了 SSR 的渲染成本,又付出了 CSR 的 hydration 成本。

3. 額外的 HTTP roundtrip

CSR 只需要一次 HTTP 請求(下載 JS bundle)。Islands 需要兩次:先下載 HTML,再下載 JS 做 hydration。在高延遲網路下,每個 roundtrip 都是成本。


什麼時候用什麼

CSR(客戶端渲染)

適合:

  • 登入後的 dashboard、管理後台
  • 互動為主的 SPA(類似 Figma、Notion)
  • 不需要 SEO 的內部工具

不適合:

  • 需要 SEO 的公開頁面
  • 首屏速度是 KPI 的場景

為什麼: CSR 的 HTML 初始只有一個 <div id="root"></div>,搜尋引擎爬到的是空白頁面。雖然 Googlebot 現在能執行 JavaScript,但 crawl budget 有限,CSR 頁面被索引的速度比 SSR 慢。

SSR(服務端渲染)

適合:

  • 電商產品頁、部落格文章
  • 需要 SEO + 首屏速度兼顧
  • Next.js / Nuxt.js 的主場

不適合:

  • Server 負載已經很高的場景(SSR 會增加 server 壓力)
  • 純 API + SPA 的架構

注意: SSR 把渲染工作從瀏覽器搬到 server。如果你的 server 已經在跑 bcrypt(參考 第 25 篇),再加 SSR 的 CPU 消耗,server 會更早到達瓶頸。

Islands(部分 hydration)

適合:

  • 部落格、文件站、行銷頁
  • 「90% 靜態內容 + 10% 互動元件」的頁面
  • Astro 的主場

不適合:

  • SPA(整頁都是互動元件)
  • 互動元件多於靜態內容的頁面

Hydration 的 Main Thread 成本

我們測了 Todos 頁面各框架在 hydration 階段佔用 Main Thread 的時間:

框架Hydration Main Thread 時間說明
Svelte最低編譯時處理完,runtime 幾乎無 hydration
Vue響應式系統輕量
ReactVirtual DOM diff + reconciliation
AngularZone.js + Change Detection
Astro最高SSR HTML + 全頁 hydration = 雙重成本

Main Thread 時間直接影響 FID(First Input Delay)。 如果 hydration 佔了 Main Thread 500ms,用戶在這 500ms 內點按鈕不會有反應。


和後端壓測的連結

前端渲染策略的選擇會影響後端壓力:

策略對後端的影響
CSR後端只需要回 API JSON,壓力最小
SSR後端要渲染 HTML,CPU 壓力增加 30-50%
Islands後端渲染靜態 HTML(可快取),壓力介於 CSR 和 SSR 之間

如果你的後端已經在 CRUD 場景 中被 bcrypt 打到天花板,加 SSR 等於雪上加霜。這也是為什麼很多團隊選擇 CSR + API 分離——讓前端的渲染壓力留在瀏覽器端,不要加到 server 上。


F2E 小結

兩篇 F2E 的核心 takeaway:

  1. Lighthouse 分數差距小(6 分),不是選框架的依據第 34 篇
  2. Bundle size 和渲染策略才是真正的差異(本篇)
  3. React 是安全牌,Svelte 是極致效能,Vue 是均衡,Angular 不用為了 6 分換掉
  4. Astro Islands 適合內容型網站,不適合 SPA
  5. 前端選型看生態,後端選型看壓測數據

接下來進入 DB 層——PG vs MySQL、ORM vs Raw SQL、Bulk Insert 快 26 倍。和後端框架比較不同,DB 層的選型直接影響每一層的效能天花板。


下一篇

PostgreSQL vs MySQL:3.2 倍的 JSON 差距 — 同一個 Express-TS + Sequelize,只換 DB。PG 在 JSON 查詢快 3.2 倍,但 MySQL 在大量寫入快 2.5 倍。不是「PG 一定比較好」。


本系列文章

完整 68 篇目錄見 系列首頁

← 上一篇:前端框架 Lighthouse 排名:React 99 分但差距其實不大 → 下一篇:PostgreSQL vs MySQL:不是誰比較好,是場景不同