---
# System prepended metadata

title: Explain what a single page app is and how to make one SEO-friendly.

---

# Explain what a single page app is and how to make one SEO-friendly.
*[SSR]: Server-Side Rendering 
*[CSR]: Client-Side Rendering
*[SPA]: Single Page Application
*[MPA]: Multi Page Application


## 什麼是 SPA (單頁式應用)？
早期的網站都是以靜待網頁/多頁式網頁 MPA 為主， ==從Server端渲染好網頁程式(HTML)，再傳送到client端== ，當使用者點擊到其他頁面或是導航到其它 URL 時，網頁整個頁面會刷新，server會為新頁面發送新的 HTML，這也就是 SSR 伺服器渲染.

2004年Gmail問世，Gmail 充分利用了瀏覽器的 XMLHttpRequest，透過這個 API 送出 Request，再透過 JavaScript 變更目前畫面上的內容！就不會造成網頁整個刷新了！（其實就是之前談到的AJAX技術帶來的改變～前端分擔了伺服器端的工作，降低了伺服器的運算效能消耗及資料吞吐量，伺服器端 MVC 中 View 的部分，交給了前端來處理，取得資料、處理畫面、頁面跳轉...等等，讓網站使用像是使用應用程式一樣流暢）

網頁應用程式Web Applicaiton/單頁式網頁 SPA 開始崛起， CSR 客戶端渲染取而代之，==程式傳送到Client才產生HTML==，所以一開始Client收到的HTML，只有一些網頁的基本架構(如下圖)，主要的實際內容要由js檔去取得，瀏覽器需要下載大量 JavaScript 檔案後，才計算、渲染畫面，導致首次訪問網站時需要較長的反應時間，好處是後續的網頁互動會很快。

![](https://i.imgur.com/LPjZmx2.png)

回到首次訪問網站時，只下載一個沒有實際內容的架構，導致搜尋引擎的爬蟲爬到的也只是一個空殼，SEO面臨了極大的挑戰！

:::warning
SSR 跟 CSR 的主要差別在於網頁是在哪裡被渲染的
:::
### SSR vs CSR
#### Server-Side Rendering
* 傳統網頁渲染的方式，從Server產生HTML後，再傳送到Client。
* 頁面由伺服器產生，每次更新頁面都需要全畫面重新渲染。
* 伺服器取得資料後，需要計算畫面並整頁送出，運算及流量的負荷都太大。

#### Client-Side Rendering
* Modern web的網頁開發框架主要是以CSR為主，通常是SPA的網頁開發框架。
* 程式傳送到Client才產生HTML，所以一開始Client收到的HTML，幾乎是一張白紙，只有進入點（root）。
* SPA藉由先傳送程式碼到Client，來增加Client瀏覽網站的流暢度，在某些情境可以加速載入。
![](https://i.imgur.com/uvPqNky.png)

![](https://i.imgur.com/eF8OxN6.png)

![](https://i.imgur.com/7ZL2n1a.png)
SSR網站更快的渲染，而CSR有一段空白在下載檔案
![](https://i.imgur.com/wVv0zaJ.png)
SSR檔案大，CSR回覆更快（這個範例出於某種原因主頁除外）





## CSR的SEO問題?
### 對html做設定..
html架構是會被讀取到的，所以我們可以在html設定,meta標籤,網頁分享的og (open graph),Keywords,壓縮圖片大小、loading 速度,JSON-LD(JavaScript Object Notation for Linked Data)等等等
[SEO Site ckeckup](https://seositecheckup.com/)
[如何加強網站的SEO - 基礎篇](https://blog.yyisyou.tw/5ac95a76/)
[如何加強網站的SEO - 進階篇](https://blog.yyisyou.tw/68015a49/)

### Isomorphic ( universal ) JavaScript 同構/通用的JavaScript概念

由於要達到SSR效果的目的是為了要讓Search engine讀懂網站的內容是什麼，並非真的要產生網站給Search engine使用，因此只要先寫好Client和Server共用的程式碼，並且在Server就把Client-side的程式碼跑過一遍，就可以達到目的了。
講白一點就是只會render一半，再傳給Client進行完整render的動作，因此流暢度也有明顯的提升。雖然是半殘的SSR，但是為了方便，其實很多人還是會直接叫SSR，而不會叫同構，這是為了方便溝通而稱呼的。

缺點就是開發技術含量很高，不止需要處理Client和Server的程式碼，還要了解Webpack的相依套件如何處理Server渲染的問題。
也就是第一畫面為 SSR，其他畫面是 CSR
###  SSR 框架(Next,Nuxt)
在這樣的概念出來後，前端框架的 SSR 框架就出來了！也就是React的Next 或 Vue的Nuxt，是原本前端框架的語法再擴充，讓原先就熟悉框架的開發者，只需要越過相對小的進入門檻，就能滿足第一頁 SSR 的需求。
###  Prerender 之類的工具
在一些資料相對簡單，變動不太大的網站，也可以選擇透過例如 Prerender 之類的工具，是先把網頁全部算好，儲存成靜態頁面，這樣也可以解決 SEO 的問題。






#### 參考文章：
[ 為什麼網站要做成 SPA？SSR 的優點是什麼？](https://medium.com/schaoss-blog/%E5%89%8D%E7%AB%AF%E4%B8%89%E5%8D%81-18-fe-%E7%82%BA%E4%BB%80%E9%BA%BC%E7%B6%B2%E7%AB%99%E8%A6%81%E5%81%9A%E6%88%90-spa-ssr-%E7%9A%84%E5%84%AA%E9%BB%9E%E6%98%AF%E4%BB%80%E9%BA%BC-c926145078a4)
[如何加強網站的SEO - 基礎篇](https://blog.yyisyou.tw/5ac95a76/)
[如何加強網站的SEO - SSR與CSR篇](https://blog.yyisyou.tw/ff55dd91/)
[SPA和MPA網站區別，SEO優缺點剖析，甚麼時候該用那個?](https://www.leunghoyin.hk/spa-vs-mpa)
[SSR vs CSR](https://dev.to/alain2020/ssr-vs-csr-2617#:~:text=the%20first%20request.-,the%20difference,client%20requests%20a%20different%20route.)
[A Closer Look at Client-Side & Server-Side Rendering](https://www.growth-rocket.com/blog/a-closer-look-at-client-side-server-side-rendering/)
[The Benefits of Server Side Rendering Over Client Side Rendering](https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8)
[說說SEO相關的話題，SPA單頁面對於SEO的優化的問題以及解決方案](https://kknews.cc/zh-tw/code/22gap5z.html)
[[IT 鐵人賽] 為何我不用 SSR？ Day 18](https://blog.hinablue.me/2019-ithome-ironman-day-18/)
[搜尋引擎最佳化 (SEO) 入門指南](https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=zh-tw)


### 補充： MPA vs SPA
#### MPA
* 內容代碼完整，搜尋引擎爬蟲就能夠輕鬆讀取網站內容然後放到適當的搜尋結果中，所以MPA對SEO友善 
* 到新頁時網站會從頭到尾，整頁刷新一次，讓瀏覽器可以取得該新頁完整內容代碼
* 合適的網站：需要安全性較高，SEO是必需的應用。例如：部落格、電商平台網站、公司資料/產品網站

#### SPA
* 除了第一次是全頁下載，之後的都是部份更新
* 訪問高效、更高開發效率、更方便維護
* 第一次看SPA網站要下載東西比較多，所以速度較慢。往後網頁互動就會很快，因為請求的資料量很少。
* 由於內容代碼不完整，搜尋引擎不一定能讀取，就算能讀取，也不是能百份百讀取到，對SEO不友好。
* 合適的網站：即時反應速度要快的應用。例如：社交網站、網上聊天室、股票報價、後台管理系統