為什麼需要 SSR(Server Side Render)

在以前沒有 SPA(Single Page Application,前後端分離)架構的時代,畫面都是在 Server 端就已經 Render 好,然後才傳送到前端的,也就是說,使用者(機器人)在拿到畫面的時候,就已經是完整的資料了。
若使用了 SPA 的架構,Server 端將不再 Render 畫面,只處理資料的部份,但畫面總要有人 Render,使用者才有東西看,也就是說,Render 畫面的重責大任就交到前端手上了,也就是我們常說的 CSR(Client Side Render)。
因此,當使用了 SPA 的架構,機器人在逛網站的時候就拿不到完整的網站了(因為 Server 端不再 Render 畫面),也就是說機器人看到的網頁只是空白一片,沒有任何內容,此時 SEO 便出現了巨大的問題。
那 SEO 的問題該怎麼辦呢?難到要放棄 SPA,技術退回 10 年前嗎?當然不是!

解決方案

其實只要讓 Server 端能夠 Render 完整的畫面,便能解決 SEO 的問題。
這裡的意思並不是要放棄 SPA,而是讓 Server 端代替前端來 Render 畫面,如此一來使用者(機器人)在拿到畫面的時候就直接是完整的畫面了,直接看下圖:

在 Server 端 Render SPA 架構的畫面,可以分成 Prerender 與 Server Side Render 兩種技術,但,差別在哪呢?

Prerender

預先 Render 好所有完整的頁面,當使用者來訪問頁面的時候,就將已經 Render 好的完整頁面回傳給使用者。

Render 時機:

  • 前端程式更新後
  • 後端資料更新後

缺點:

  • 後端更新時就需要重新 Render 畫面,後端資料更新頻繁時很吃系統資源
  • 網站如果有權限管控(使用者登入),系統將會有兩套 Render 的機制(因為只有不需要權限的部份要 Prerender),如此一來系統複雜度加大大增加

Server Side Render

當使用者訪問的時候,才 Render 畫面,再回傳給使用者。

Render 時機:

  • 使用者訪問時

缺點:

  • 一有使用者訪問就需要 Render 畫面,流量大時很吃系統資源

如何選擇

在考量系統複雜度及後續維護成本的基礎下,只要網站有後台或是權限管控的功能,都會直接選用 SSR,必竟,機器還是便宜過人力成本的。
當然 SSR 也不是萬靈丹,還是需要經過綜合評估後才能選出最適合當下的解決方案。

Nuxt.js

雖然已經選擇了 SSR,但要從零搭建 SSR 服務是非常麻煩且費工的,不過沒關係,介紹大家一個好工具 - Nuxt.js
Nuxt.js 讓我們可以專注在 Vue.js 的開發,將 SSR 這種麻煩事全部交給 Nuxt.js 來處理。


註:雖然 Google Search Bot 已經有支援 SPA 架構的 CSR 了,不過結果並不是 100% 正確的,所以在本文撰寫的當下,SSR 或 Prerender 還是必要的。