跳至主要内容

[Next.js] What is Rendering in Next.js?

Next.js 是一個基於 React 的 SSR 解決方案


Next.js 有兩種 pre-rendering 方式

  • Server-side Rendering
  • Static-site Generation (Recommended)

Server-side Rendering (服務器端渲染)

針對每個請求動態產生 HTML 頁面, 因為服務器端渲染導致性能比靜態生成慢,所以只有在絕對必要時才使用它。

附圖參考

信息

每次客戶端請求頁面時,服務器將獲取該頁面的數據(call api), 並使用該數據生成頁面的 HTML(render 畫面)。 只有完成所有這些操作後,HTML 才會發送回客戶端。

優點

  1. 伺服器端渲染不需關心瀏覽器兼容的問題
  2. 可解決 SEO 問題

缺點

  1. 每次的重新 Render 會造成後端的負擔提升也讓使用者的體驗變差
  2. Server 端渲染的頁面看上去似乎可以交互,但實際上還是要等待 js 執行完成才能交互。簡單地說,會增加 TTI(Time to Interactive)

編譯的時候,並將在每個請求上重用 HTML。

信息

將生成 HTML 頁面的工作放到編譯時,而不必在請求帶來時動態完成。 為每個 URL 預先單獨生成 HTML 文件,達到極佳的 FCP 效能。

附圖參考

實際操作

  1. 使用 next export: 將所有頁面導出到可以與任何主機一起使用的靜態 HTML 文件
  2. 用 nginx 做反向代理: 針對 out folder 啟動 next server

要怎麼選擇使用 Server-side Rendering 或是 Static Generation

部落格,官網,電子商務產品列表...等靜態頁面 => 使用 Static Generation

兩者都能解決 SEO 問題

附圖參考

此圖參考網址:https://zhuanlan.zhihu.com/p/113853235

bonus : csr vs. ssr vs. Static Rendering 👈

參考: https://developers.google.com/web/updates/2019/02/rendering-on-the-web

Client-Side Rendering (CSR)

在前端進行 Render,後端作為資料供應的 API 層。 當需要新的資料時,前端發送 Request 後只需要部份更新畫面就好。

渲染流程:

  1. 客戶端發起頁面請求,服務端把頁面(響應的字符串)發送給 Client 端
  2. Client 端從上到下依次解析,解析過程中,發現網絡請求,再次向服務器發送網絡請求,Client 端拿到響應的結果,render 出 HTML 頁面。

附圖參考

優點:

  1. 靈活,真正的前後端分離,方便於前後台各自更新維護。

缺點:

  1. 有些 CSR 的網站會造成爬蟲取得的頁面不是那麼完整,造成 SEO 的問題。
  2. 第一次載入畫面是等到前端載入後,會有一段時間的空白。

Server-side Rendering

Server 端完全可以在獲取到 HTML 文件的內容之後經過一些處理再返回給 Client 端,也就說,Server 端可以將數據插入到 HTML 字符串中之後再返回給 Client 端

渲染流程: 在後端接收到 Request 即產生 HTML 畫面給前端,
伺服器每次收到請求時在產生對應的靜態頁面

簡單來說 client 不用下載大量的 javascript, 因為 HTML 渲染整個是在 Server 端完成在將 HTML 傳至 client 端的瀏覽器顯示。

每當有 client 發起對某個頁面的 request 時,server 會抓取對應的資料,建立完整的 HTML,最後再回傳給 client,不需要先下載一堆 JS 和 CSS 後才能看到頁面(FCP 加載速度快),即使因為 JS 還沒被執行,所以畫面還不具備互動性,但讓使用者先看到畫面,再利用人的感知延遲時間去執行 JS code,可以大大減少使用者的跳出率

附圖參考

優點:

  1. SEO。
  2. 不需要先下載一堆 JS 和 CSS 後才能看到頁面(FCP 加載速度快)。

缺點:

  1. 因渲染在 Server 端,這樣的作法不論點擊什麼網頁上什麼功能,每一次都是將整個畫面重新繪製,如果在頻寬網路較差的情況下,會是一個較不好的體驗,因為要一直重新 loading 整個頁面

Static-site Rendering

需要為每個 URL 單獨生成一份 HTML 文件, 靜態頁面是在 build-time 時就產生,伺服器收到 request 時重複使用這些已經生成好的靜態頁面。

渲染流程: server 每次收到 request 是都是回傳「相同的」、「一開始就產生好的」 HTML 檔給 client。

附圖參考

筆記

提示
  • SSR 和 CSR 的最大差異是使用者最終 UI 上看到的 HTML DOM 元素是由 server 產生(SSR)、 或是由 client(CSR)所產生
  • SSR 和 SSG 最大的差異是在 HTML 檔案被建立、產生的時間點。SSR 會在每次收到 request 時才產生對應的 HTML,因此每次回傳 client 的 HTML 對 server 來說都是獨立不同的;但 SSG 是在一開始就把所有需要用到的頁面都建立出來,在收到 request 時就直接用相同、一開始就產生好的 HTML 回傳回去。

參考文件