服務器端渲染和客戶端渲染


什么是服務器端渲染和客戶端渲染?

    互聯網早期,用戶使用瀏覽器瀏覽的都是一些沒有復雜邏輯的、簡單的頁面,這些頁面都是在后端將html拼接好的然后將之返回給前端完整的html文件,瀏覽器拿到這個html文件之后就可以直接解析展示了,而這也就是所謂的服務器端渲染了。而隨着前端頁面的復雜性提高,前端就不僅僅是普通的頁面展示了,而可能添加了更多功能性的組件,復雜性更大,另外,彼時ajax的興起,使得業界就開始推崇前后端分離的開發模式,即后端不提供完整的html頁面,而是提供一些api使得前端可以獲取到json數據,然后前端拿到json數據之后再在前端進行html頁面的拼接,然后展示在瀏覽器上,這就是所謂的客戶端渲染了,這樣前端就可以專注UI的開發,后端專注於邏輯的開發。

  

兩者本質的區別是什么?

  客戶端渲染和服務器端渲染的最重要的區別就是究竟是誰來完成html文件的完整拼接,如果是在服務器端完成的,然后返回給客戶端,就是服務器端渲染,而如果是前端做了更多的工作完成了html的拼接,則就是客戶端渲染。

 

服務器端渲染的優缺點是怎樣的?

優點:

  1. 前端耗時少。因為后端拼接完了html,瀏覽器只需要直接渲染出來
  2. 有利於SEO。因為在后端有完整的html頁面,所以爬蟲更容易爬取獲得信息,更有利於seo。
  3. 無需占用客戶端資源。即解析模板的工作完全交由后端來做,客戶端只要解析標准的html頁面即可,這樣對於客戶端的資源占用更少,尤其是移動端,也可以更省電。
  4. 后端生成靜態化文件。即生成緩存片段,這樣就可以減少數據庫查詢浪費的時間了,且對於數據變化不大的頁面非常高效 。

缺點:

  1. 不利於前后端分離,開發效率低。使用服務器端渲染,則無法進行分工合作,則對於前端復雜度高的項目,不利於項目高效開發。另外,如果是服務器端渲染,則前端一般就是寫一個靜態html文件,然后后端再修改為模板,這樣是非常低效的,並且還常常需要前后端共同完成修改的動作; 或者是前端直接完成html模板,然后交由后端。另外,如果后端改了模板,前端還需要根據改動的模板再調節css,這樣使得前后端聯調的時間增加。
  2. 占用服務器端資源。即服務器端完成html模板的解析,如果請求較多,會對服務器造成一定的訪問壓力。而如果使用前端渲染,就是把這些解析的壓力分攤了前端,而這里確實完全交給了一個服務器。

 

客戶端渲染的優缺點是怎樣的?

優點:  

  1. 前后端分離。前端專注於前端UI,后端專注於api開發,且前端有更多的選擇性,而不需要遵循后端特定的模板。
  2. 體驗更好。比如,我們將網站做成SPA或者部分內容做成SPA,這樣,尤其是移動端,可以使體驗更接近於原生app。

缺點:

  1. 前端響應較慢。如果是客戶端渲染,前端還要進行拼接字符串的過程,需要耗費額外的時間,不如服務器端渲染速度快。
  2. 不利於SEO。目前比如百度、谷歌的爬蟲對於SPA都是不認的,只是記錄了一個頁面,所以SEO很差。因為服務器端可能沒有保存完整的html,而是前端通過js進行dom的拼接,那么爬蟲無法爬取信息。 除非搜索引擎的seo可以增加對於JavaScript的爬取能力,這才能保證seo。

 

 

使用服務器端渲染還是客戶端渲染?

  不談業務場景而盲目選擇使用何種渲染方式都是耍流氓。比如企業級網站,主要功能是展示沒有復雜的交互,並且需要良好的SEO,則這時我們就需要使用服務器端渲染;而類似后台管理頁面,交互性比較強,不需要seo的考慮,那么就可以使用客戶端渲染。

  另外,具體使用何種渲染方法並不是絕對的,比如現在一些網站采用了首屏服務器端渲染,即對於用戶最開始打開的那個頁面采用的是服務器端渲染,這樣就保證了渲染速度,而其他的頁面采用客戶端渲染,這樣就完成了前后端分離。

 

 

對於前后端分離,如果進行seo優化?

  如果進行了前后端分離,那么前端就是通過js來修改dom使得html拼接完全,然后再顯示,或者是使用SPA,這樣,seo幾乎沒有。那么這種情況下如何做seo優化呢?

  我們可以自行提交sitemap讓蜘蛛主動去爬取,但是遇到了sitemap中的url,達到指定頁面之后只有元js怎么辦呢?這是我們可以使用<noscript>標簽來進行簡單的優化,比如打印出當前頁面信息的一些關鍵的信息點,但是正常用戶並不需要這些,會造成額外的負擔,且前端可以判斷是否支持JavaScript,而后段不行,只好根據百度的spider做UA判斷,使用phantomjs或者nginx代理,來對spider訪問的頁面進行特殊的處理,達到被收錄的效果。但這種效果還是不好。。。

  而目前的react和vue都提供了SSR,即服務器端渲染,這也就是提供seo不好的解決方式了。

 

 

 

究竟如何理解前后端分離?

  實際上,時至今日,前后端分離一定是必然或者趨勢,因為早期在web1.0時代的網頁就是簡單的網頁,而如今的網頁越來越朝向app前進,而前后端分離就是實現app的必然的結果。所以,我們可以認為html、css、JavaScript組成了這個app,然后瀏覽器作為虛擬機來運行這些程序,即瀏覽器成為了app的運行環境,成了客戶端,總的來說就是當前的前端越來越朝向桌面應用或者說是手機上的app發展了,而比如說電腦上的qq可以服務器端渲染嗎?肯定不能!所以前后端分離也就成了必然。而我們目前接觸額前端工程化、編譯(轉譯)、各種MVC/MVVM框架、依賴工具、npm、bable、webpack等等看似很新鮮、創新的東西實際上都是傳動桌面開發所形成的概念,只是近年來前端發展較快而借鑒過來的,本質上就是開源社區東平西湊做出來的一個visual studio。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM