Try   HackMD

2023/04/07

快速了解Next.js中的網頁渲染技術重點: SSR、SSG、ISR與CSR

前言

Next.js 是 React 的網頁框架。在學習使用 Next.js 開發的時候,我們會接觸到四種常見的網頁渲染技術。我們需要考量該選擇使用哪些網頁渲染技術,較為適合開發中的網站或應用程式。

先解釋一下這四種技術的英文縮寫:

SSR:Server Side Rendering,伺服器端渲染
SSG:Static Site Generation,靜態網站生成
ISR:Incremental Site Rendering,增量式的網站渲染
CSR:Client Side Rendering,客戶端(通常是瀏覽器)渲染

Next.js pre-rendering 預渲染

Next.js 有一個特點是支援預渲染,預設會預渲染每個頁面,目的是可以帶來更好的性能以及 SEO。
Next.js 會將網站的所有頁面提前生成靜態 HTML 文件並保存下來,如此一來當使用者訪問網站時,伺服器會回傳預渲染好的靜態 HTML 文件,而不是使用 JavaScript 動態生成網頁內容。
Next.js 的預渲染又分為兩種形式,分別是靜態網站生成 SSG(Static Site Generation)伺服器端渲染 SSR(Server Side Rendering)

SSR 伺服器端渲染

  • 可以讓伺服器動態地注入資料到 HTML 的檔案中,讓客戶端第一次請求拿到的 HTML 就已經包含所有的資料,因此 google 爬蟲也就可以順利地爬到網站中的內容,利於 SEO。
  • 因為每次請求都會重新生成頁面,使用 SSR 就必須有個伺服器一直處理使用者的請求,一直產生有資料的 HTML,並送到客戶端,這樣的工作對於伺服器來說是一個負擔。
  • 適合需要經常展示更新數據資料的網站。

獲取資料的方式

  • 將在伺服器端的每個頁面請求中執行一個異步函數getServerSideProps以從 API 獲取資料。
  • 載入頁面之前,首先將執行該函數並產生延遲,然後再為頁面提供服務。

SSG 靜態網站生成

  • 所有的內容都在 連結(build) 的時候都打包進入檔案中,所以使用者在瀏覽網站時,就可以拿到完整的HTML檔案。
  • 除了有利於 SEO 之外,還有因為每次使用者拿到的 HTML 內容都不會變,所以還可以讓 HTML 被 cache 在 CDN 上,很適合用在資料變動較小的網頁中,像是部落格、產品介紹頁這種應用中。

獲取資料的方式

  • 執行特殊函數:getStaticProps來獲取一次數據。

getServerSideProps vs. getStaticProps

getServerSidePropsgetStaticProps 是 Next.js 中用於資料預取的兩個函數:

  • getServerSideProps 會在每次請求時都重新取得資料,而 getStaticProps 則是在編譯時就取得資料,並將資料儲存在靜態檔案中。
  • 使用 getServerSideProps 時,網頁的載入速度會比較慢,但是資料是最新的。
  • 當使用 getStaticProps 時,網頁的載入速度會比使用 getServerSideProps 更快,但是資料可能不是最新的。

如果要網頁在每次請求時都重新取得資料,則應該使用 getServerSideProps。如果您需要在編譯時就取得資料,則應該使用 getStaticProps。如果您需要在編譯時就取得資料,但是又希望資料是最新的,則可以使用 revalidate屬性。

ISR 增量式的網站渲染

ISR基本上是SSG和SSR的結合體。在首次生成靜態頁面之後,有新數據時會重新生成該頁面。ISR適用於需要SEO最佳化和首次載入速度快且需要動態更新內容的網頁。
使用ISR需要在getStaticProps函數中添加revalidate屬性,並指定一個秒數,表示多久重新產生一次頁面。例如: revalidate: 10 表示每10秒重新產生一次頁面。

獲取資料的方式

  • 執行特殊函數: getStaticProps + revalidate

CSR 客戶端渲染

  • 只要上述的這些 API,例如 getStaticPropsgetServerSideProps 我們都沒有使用,數據都是通過在組件內部使用 axios或者fetch去發送請求獲取並渲染的,那麼我們使用的就是純客戶端渲染了。
  • 這種方式與SSR是相對的,使用上需分離前後端。
  • 渲染資料的所有過程都交由客戶端(瀏覽器)處理,使用者在瀏覽網站時,第一次跟伺服器請求的 HTML 檔裡面幾乎不包含任何的內容,伺服器並沒有傳入資料到 HTML。接著,後續會再透過載入的 bundle,也就是 JavaScript 的檔案,再讓 JS 執行 AJAX 跟伺服器請求資料,最後將資料渲染到畫面上,使用者會比較慢看到網頁的內容。

獲取資料的方式

  • 使用 useEffect 函數。
  • 它會在客戶端的每個頁面請求中從 API 獲取數據(頁面被渲染後,函數將執行)。

小結與簡單比較

  • SSR 是在每次請求時動態地從 API 獲取數據並注入到 HTML 中,可以提高 SEO 效果,但會增加伺服器的負擔。適合用於需要經常展示更新數據的網站。
  • SSG 是在 build 時就生成所有頁面和數據,可以提高性能和安全性,但不適合用於需要動態更新數據的網站。適合用於資料變動較小的網站。
  • ISR 是在首次生成靜態頁面後,每當有新數據時會重新生成該頁面,可以結合 SSG 和 SSR 的優勢,既可以提高 SEO 效果和首次加載速度,又可以動態更新內容。適合用於需要 SEO 優化和首次加載速度快且需要動態更新內容的網站,且需要配置revalidate參數來控制更新頻率。
  • CSR 是在 bundle 載入後才跟伺服器要數據,可以減少伺服器的負擔,但會降低 SEO 效果和首次加載速度。適合用於不需要 SEO 優化和首次加載速度快且需要前後端分離的網站。

參考