###### tags: `Web` `Front End` # CSR與SSR概述比較 此文章針對SSR與CSR作個解釋與比較 ### 名詞解釋 #### SSR,CSR - SSR(Server-Side Rendering) : 由Server端的 CPU 收到請求後,解析完整的 HTML 返回到使用者接收端,然後呈現網頁。 - CSR(Client-Side Rendering) : 由Server端回傳資料,再由前端利用 Javascript 產生 HTML 。 在執行期間「動態」去跟後端Server拿資料,再動態產生看到的那些元素。 #### 一般Web前端評估Performance - TTFB(Time to First Byte) : 關係到網路速度、Server 處理時間,具體計算是從使用者發出 Request 到接收到第一個 Byte 的時間。 - FP(First Paint) : 瀏覽器將像素渲染到螢幕上的開始時間,通常使用者會在此時看到白屏。 - FCP(First Contentful Paint) : 覽器將使用者看得見的內容渲染到螢幕上的開始時間,例如:文字、圖片。 - TTI(Time To Interactive) : 使用者是否可與畫面互動,白話說就是使用者除了可看到畫面渲染完成外,還可進行輸入的動作。 ### Server Side Rendering (SSR) #### 簡述 每當有 client 發起對某個頁面的 request 時,server 會抓取對應的資料,建立完整的 HTML,最後再回傳給 client。簡單來說client不用下載大量的javascript,因為HTML渲染整個是在Server端完成在將HTML傳至client端的瀏覽器顯示。 ![](https://i.imgur.com/LlMqYnb.png) #### 優點 因為執行js渲染HTML在Server端完成,解析完整的HTML後傳回到使用者接收端呈現。在Server設備比Client設備性能好的情況下,他具有較好的FP與FCP性能,且因可直接避免傳送大量Javascript給Client。藉此可達到較好的TTI性能。 還有一點是SSR可以解決 SEO 的問題,因為爬蟲爬到的都是從 server 建立好並帶上資訊的完整 HTML。純CSR設計只有HTML Tag,Goole爬蟲抓不到相對應關鍵字,所以在熱搜效果上SSR的效果來的比CSR還好。 #### 缺點 因渲染在Server端,這樣的作法不論點擊什麼網頁上什麼功能,每一次都是將整個畫面重新繪製,如果在頻寬網路較差的情況下,會是一個較不好的體驗,因為要一直重新 loading 整個頁面。另外因伺服器取得資料後,需要計算畫面並整頁送出,運算及流量的負荷都太大。 SSR架構與邏輯會變得十分複雜,許多程式會需要分別在 server 與 client 做處理,也要特別小心不能在 server 端執行到包含如 window 等 browser 的 API,會將專案複雜度往上提高一個層級。 SSR Sample Code(Not MVC) ![](https://i.imgur.com/hgXsANJ.png) ### Client-Side-Rendering (CSR) #### 簡述 Client透過 Router 決定該渲染出哪些元素在畫面上或是該抓哪些 API data,當前端拿到資料以後,才用 JavaScript 動態的把那些內容填到網頁上面。而 routing 的過程也不再像以往ㄧ樣要重新去 server 抓取頁面造成頁面反白。 ![](https://i.imgur.com/z3FF28o.png) #### 優點 輕量好維護,不會跟後端的code參在一起。要拿掉或者修改某一支API會比SSR簡單。如果要動到前端的話,關注點分離,要解Bug會很明確清楚知道前後端哪邊的問題,且單元測試撰寫方便。 另外CSR最大的好處就是大量的工作都在瀏覽器中完成,服務端承擔更少的工作,這樣就可以處理更多的請求。 #### 缺點 需要仰賴前端下載大量 JavaScript 檔案,隨後才計算、渲染畫面,造成FP與FCP相對來說會比較差,在性能較差的行動裝置上更明顯;除此之外,也因為伺服器僅提供載入 JavaScript 的空殼 HTML,因此SEO效益很差。 ### Summary 現今Client端的設備(手機,電腦)都具有相當的水準,<font color="#f00">故SSR只剩SEO與FP較具優勢,但SEO的問題就算使用CSR角度開發,使用Hybrid也能將SEO的問題解決掉</font>。故網頁開發上目前大都是選擇在Client Run Javascript渲染Html Code。且目前前端框架已非常成熟,除了常見MVC Pattern,大都也開始轉向MVVM Pattern,且也具有DI機制,可以彈性抽換真實的後端Data與MockData,在開發測試過程中是具有較佳的管理機制。 ### 參考 [Rendering on the Web](https://developers.google.com/web/updates/2019/02/rendering-on-the-web) [Performance - Web Vitals](https://ithelp.ithome.com.tw/articles/10248039) [跟著小明一起搞懂技術名詞:MVC、SPA 與 SSR](https://www.bnext.com.tw/article/49172/code-mvc-spa-ssr-html)