前端渲染和后端渲染

  • 服務端渲染(吐)

    服務端在返回 html 之前煮嫌,在特定的區(qū)域,符號里用數(shù)據(jù)填充抱虐,再給客戶端昌阿,客戶端只負責解析 HTML 。

服務端渲染

也被稱為 fat-server, thin-client 模式



服務端渲染
  • 客戶端渲染(填)

    html 僅僅作為靜態(tài)文件,客戶端端在請求時懦冰,服務端不做任何處理灶轰,直接以原文件的形式返回給客戶端客戶端,然后根據(jù) html 上的 JavaScript刷钢,生成 DOM 插入 html笋颤。

客戶端渲染

也被稱為 fat-client, thin-server 模式


客戶端渲染

異同

  • 渲染本質一樣,都是字符串拼接闯捎,將數(shù)據(jù)渲染進一些固定格式的html代碼中形成最終的html展示在用戶頁面上椰弊。

  • 拼接字符串必然引起性能的消耗。

    服務端渲染性能消耗在服務端瓤鼻,當用戶量比較多時秉版,緩存部分數(shù)據(jù)以避免過多數(shù)據(jù)重復渲染。 客戶端渲染茬祷,如當下火熱的 spa 框架清焕,Angular、React祭犯、Vue秸妥,在首次渲染時,大多是將原 html 中的數(shù)據(jù)標記(如 {{ text }} )替換沃粗≈嗑澹客戶端渲染較難的一點是數(shù)據(jù)更新以后,頁面響應式更新時如何節(jié)省資源最盅,直接 DOM 的讀寫突雪,是很消耗性能的。 Vue 2.0 + 有 Vnode涡贱,進行 diff 后咏删,渲染到頁面上。

利弊

[圖片上傳失敗...(image-b97b92-1542164471424)]

同構

為了解決客戶端渲染首屏慢與 SEO 問題问词,同構開始出現(xiàn)督函。

同構:前后端共用 JS,首次渲染時使用 Node.js 來直出 HTML激挪。一般來說同構渲染是介于前后端中的共有部分辰狡。

[圖片上傳失敗...(image-825a-1542164471424)]

同構

同構優(yōu)點有很多,balabalabala……

簡單說下在使用 Vue SSR(nuxt)的一些坑:

  • 服務端必須是 node.js 或者專門跑個 node.js 來支持灌灾;

  • document 對象找不到搓译,由于前端使用的 window,在 node 環(huán)境不存在锋喜;

  • 數(shù)據(jù)預獲取時些己,組件尚未實例化(無法使用 this )豌鸡,于是在 created 生命鉤子調用 method 里的方法行不通,數(shù)據(jù)請求及格式化等操作都應該放置在專門的數(shù)據(jù)預取存儲容器(data store)或"狀態(tài)容器(state container)"中處理段标;

  • string-based 模板性能肯定要比 virtual-dom-based 模板的性能好涯冠。string-base 模板只要填數(shù)據(jù)即可,virtual-dom-based 模板需要經歷 Vue 模板語法 ---> Vnode ---> 拼接字符串 html 的過程逼庞。 有關性能的消耗對比蛇更,可以參考這篇文章 mp.weixin.qq...

  • 緩存方面赛糟,只能做到頁面級的緩存派任。如果用戶特定(user-specific),即對于不同用戶需要渲染不同內容璧南,緩存是不可用的掌逛。

是否有其他解決客戶端渲染不足之處的方法?

答案肯定是有的:

  • 處理 SEO 問題時司倚,使用 prerender... 豆混、升級搜索引擎,以及其他动知。

  • 白屏可以加 loading皿伺、Skeleton Screen 效果、以及其他盒粮。

總結

用戶體驗才是王道鸵鸥。

后端渲染(SSR、服務端渲染)

后端渲染HTML的情況下丹皱,瀏覽器會直接接收到經過服務器計算之后的呈現(xiàn)給用戶的最終的HTML字符串脂男,這里的計算就是服務器經過解析存放在服務器端的模板文件來完成的,在這種情況下种呐,瀏覽器只進行了HTML的解析,以及通過操作系統(tǒng)提供的操縱顯示器顯示內容的系統(tǒng)調用在顯示器上把HTML所代表的圖像顯示給用戶弃甥。

前端渲染(SPA爽室、單頁面應用)

前端渲染就是指瀏覽器會從后端得到一些信息,這些信息或許是適用于題主所說的angularjs的模板文件淆攻,亦或是JSON等各種數(shù)據(jù)交換格式所包裝的數(shù)據(jù)阔墩,甚至是直接的合法的HTML字符串。這些形式都不重要瓶珊,重要的是啸箫,將這些信息組織排列形成最終可讀的HTML字符串是由瀏覽器來完成的,在形成了HTML字符串之后伞芹,再進行顯示忘苛。

題主所提到的幾個技術蝉娜,我認為模板這個詞語并不能用來區(qū)分這些技術的本質,模板只是一種提供給程序來解析的一種語法扎唾,換句話說召川,模板是用于從數(shù)據(jù)(變量)到實際的視覺表現(xiàn)(HTML代碼)這項工作的一種實現(xiàn)手段,而這種手段不論在前端還是后端都有應用胸遇。

以下為本人自己的想法:在性能上荧呐,我認為后端渲染最終會被前端渲染,因為后端渲染將所有的HTML生成集中在了一個服務器上纸镊,而前端渲染將這部分工作分發(fā)到各個終端上倍阐。另外,對于開發(fā)而言逗威,這樣能夠避免后端開發(fā)人員過多的編寫HTML代碼峰搪,后端開發(fā)人員只需和前端開發(fā)事先商定好數(shù)據(jù)格式,后端就只需將數(shù)據(jù)生成庵楷,用數(shù)據(jù)交換格式包裝罢艾,再發(fā)送出去就可以了,這樣能夠使開發(fā)人員之間的分工更加明確尽纽。

再附上稀土掘金上的一段理解:

SEO

很重要咐蚯,所以要普及。

SEO: 搜索引擎優(yōu)化(Search Engine Optimization)弄贿,它是指通過站內優(yōu)化春锋,如:網站結構調整、網站內容建設差凹、網站代碼優(yōu)化以及站外優(yōu)化等方法期奔,來進行搜索引擎優(yōu)化。

簡單說: 通過各種技術(手段)來確保危尿,你的Web內容被搜素引擎最大化收錄呐萌,最大化提高權重,帶來更多流量谊娇。

常見關鍵詞:白帽肺孤、黑帽、SEM济欢、Backlink赠堵、Linkbait、PageRank法褥、Keyword Stuffing...茫叭,總之都圍繞著一個核心:SEO;流量是變現(xiàn)的快車道半等,SEO是低成本獲取流量的最佳方法揍愁。

SPA

SPA:單頁Web應用(single page web application呐萨,SPA),就是只有一張Web頁面的應用吗垮,是加載單個HTML 頁面并在用戶與應用程序交互時動態(tài)更新該頁面的Web應用程序垛吗。

簡單說: Web不再是一張張頁面,而是一個整體的應用烁登,一個由路由系統(tǒng)怯屉、數(shù)據(jù)系統(tǒng)、頁面(組件)系統(tǒng)...組成的應用程序饵沧,其中路由系統(tǒng)是非必須的锨络。

大部分的Vue項目,本質是SPA應用狼牺,Angular.js羡儿、Angular、Vue是钥、React...還有最早的"Pjax"均如此掠归。

SPA時代,主要是在Web端使用了history或hash(主要是為了低版本瀏覽器的兼容)API悄泥,在首次請求經服務端路由輸出整個應用程序后虏冻,接下來的路由都由前端掌控了,前端通過路由作為中心樞紐控制一系列頁面(組件)的渲染加載和數(shù)據(jù)交互弹囚。

而上面所述的各類框架則是將以:路由厨相、數(shù)據(jù)、視圖為基本結構進行的規(guī)范化的封裝鸥鹉。

最早的SPA應用蛮穿,由Gmail、Google Docs毁渗、Twitter等大廠產品實踐布道践磅,廣泛用于對SEO要求不高的場景中。

SSR

SSR: 服務端渲染(Server Side Render)灸异,即:網頁是通過服務端渲染生成后輸出給客戶端音诈。

在SPA之前的時代,我們的Web架構大都是SSR绎狭,如:Wordpress(PHP)、JSP技術褥傍、JavaWeb...或者DEDECMS儡嘶、Discuz!等這些程序都是傳統(tǒng)典型的SSR架構,
即:服務端取出數(shù)據(jù)和模板組合生成html輸出給前端恍风,前端發(fā)生請求時蹦狂,重新向服務端請求html資源誓篱,路由也由服務端來控制。

其次凯楔,有個概念叫預渲染(Prerendering)窜骄。

如果你只是用服務端渲染來改善一個少數(shù)的營銷頁面(如 首頁,關于摆屯,聯(lián)系 等等)的SEO邻遏,那你可以用預渲染來實現(xiàn)。
預渲染不像服務器渲染那樣即時編譯HTML虐骑,它只在構建時為了特定的路由生成特定的幾個靜態(tài)頁面准验,等于我們可以通過webpack插件將一些特定頁面組件build時就編譯為html文件,直接以靜態(tài)資源的形式輸出給搜索引擎廷没。

但實際的商業(yè)應用中糊饱,大部分時候我們需要的是即時渲染,這也是我們今天討論的主題颠黎。

Why

為什么要SSR另锋,為了體驗,還有SEO狭归。

首先夭坪,用戶可能在網絡比較慢的情況下從遠處訪問網站 - 或者通過比較差的帶寬。 這些情況下唉铜,盡量減少頁面請求數(shù)量台舱,來保證用戶盡快看到基本的內容。
可以用Webpack的代碼拆分避免強制用戶下載整個單頁面應用潭流,但是竞惋,這樣也遠沒有下載個單獨的預先渲染過的HTML文件性能高。

對于世界上的一些地區(qū)人灰嫉,可能只能用1998年產的電腦訪問互聯(lián)網的方式使用計算機拆宛。
而Vue只能運行在IE9以上的瀏覽器,你可能也想為那些老式瀏覽器提供基礎內容 - 或者是在命令行中使用 Lynx的時髦的黑客讼撒。

在大部分的商業(yè)應用中浑厚,我們有SEO的需求,我們需要搜索引擎更多地抓取到我們的內容根盒,更詳細地認識到我們的網頁結構钳幅,而不是僅對首頁或特定靜態(tài)頁進行索引,這是SSR最重要的意義炎滞。

簡單說就是敢艰,我們需要搜素引擎看到這樣的代碼:

這里寫圖片描述

而不是這樣的代碼:

這里寫圖片描述

且,我們還需要在SSR的基礎上實現(xiàn)SPA册赛,即:首屏渲染钠导。

基本流程是:

在瀏覽器第一次訪問某個URI資源的時候(首屏)震嫉,Web服務器根據(jù)路由拿到對應數(shù)據(jù)渲染并輸出,且輸出的數(shù)據(jù)中包含兩部分:

  • 路由頁對應的頁面及已渲染好的數(shù)據(jù)
  • 完整的SPA程序代碼

在客戶端首屏渲染完成之后牡属,此時我們看到的其實已經是一個和之前的SPA相差無幾的應用程序了票堵,接下來我們進行的任何操作都只是客戶端的應用進行交互,
頁面/組件由Web端渲染逮栅,路由也由瀏覽器控制悴势,用戶只需要和當前瀏覽器內的應用打交道就可以了。

之前在各大SPA框架還未正式官方支持SSR時证芭,有一些第三方的解決方案瞳浦,如:prerender.io
它們做的事情就是建立HTTP一個中間層废士,在判斷到訪問來源是蜘蛛時叫潦,輸出已緩存好的html數(shù)據(jù),此數(shù)據(jù)若不存在官硝,則調用第三方服務對html進行緩存矗蕊,往復進行。

另一方法是自行構建蜘蛛渲染邏輯氢架,當識別UA為搜索引擎時傻咖,拿服務端已準備好的模板和數(shù)據(jù)進行渲染輸出html數(shù)據(jù),反之岖研,則輸出SPA應用代碼卿操;

我當時也考慮過此方法,但有很多弊端孙援,如:

需要針對蜘蛛編寫一套獨立的渲染模板害淤,因為大部分情況下SPA的代碼是沒法直接在服務端使用的
搜索引擎若檢測到蜘蛛抓取數(shù)據(jù)和真實訪問數(shù)據(jù)不一致,會做降權懲罰拓售,也就意味著渲染模板還必須和SPA預期輸出一模一樣
所以窥摄,最好的方法是SPA能和服務端使用同一套模板,且使用同一個服務端邏輯分支础淤,再簡單說:最好Vue崭放、Ng2...能直接在服務端跑起來。

作者:牧碼人小鵬
鏈接:http://www.reibang.com/p/14c3c4f61d90
來源:簡書
簡書著作權歸作者所有鸽凶,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處币砂。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玻侥,隨后出現(xiàn)的幾起案子道伟,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜜徽,死亡現(xiàn)場離奇詭異,居然都是意外死亡票摇,警方通過查閱死者的電腦和手機拘鞋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢门,“玉大人盆色,你說我怎么就攤上這事∷钐蓿” “怎么了隔躲?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長物延。 經常有香客問我宣旱,道長,這世上最難降的妖魔是什么叛薯? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任浑吟,我火速辦了婚禮,結果婚禮上耗溜,老公的妹妹穿的比我還像新娘组力。我一直安慰自己,他們只是感情好抖拴,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布燎字。 她就那樣靜靜地躺著,像睡著了一般阿宅。 火紅的嫁衣襯著肌膚如雪候衍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天家夺,我揣著相機與錄音脱柱,去河邊找鬼。 笑死拉馋,一個胖子當著我的面吹牛榨为,可吹牛的內容都是我干的。 我是一名探鬼主播煌茴,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼随闺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蔓腐?” 一聲冷哼從身側響起矩乐,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后散罕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分歇,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年欧漱,在試婚紗的時候發(fā)現(xiàn)自己被綠了职抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡误甚,死狀恐怖缚甩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情窑邦,我是刑警寧澤擅威,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站冈钦,受9級特大地震影響郊丛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜派继,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一宾袜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驾窟,春花似錦庆猫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恩急,卻和暖如春杉畜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衷恭。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工此叠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人随珠。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓灭袁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窗看。 傳聞我的和親對象是個殘疾皇子茸歧,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容