[轉]談談前端渲染 VS 后端渲染


首先,預編譯跟前后端沒有關系,預編譯一樣可以用於后端渲染。

看看下面的測試時間,單位: ms

模板字符串:

var s = '{{#datas}}{{name}} abcdefg {{type}} {{date}}{{/datas}}';

數據對象: 放入100000行數據

var stack = [];
for (var i = 0; i < 100000; i++) {
    stack.push({
        name: 'name-' + i,
        type: 'type-' + i,
        date: (new Date()).toLocaleString()
    });
}
var datas = {datas: stack};

后端渲染: 生成HTML

var start = Date.now();
require('hogan').compile(s).render(datas);
var end = Date.now();
console.log(end - start);  // 166 ms 我的機器時間

前端渲染: 我在這里做了最簡單的設定,只把datas轉化成字符串

var start = Date.now();
JSON.stringify(datas);
var end = Date.now();
console.log(end - start);  // 450 ms 我的機器時間

結果對比一目了然,你可以把這個測試用其他模板引擎測試一下。

服務器為了前端渲染,對對象的字符串化所消耗的時間, 遠遠大於  服務器直接渲染模板生成HTML所花費的時間。

我的建議是前后端模板同時使用.

  • 后端模板+Bigpipe處理頁面加載, 加上預編譯, 這要比直接轉換對象=>字符串快, 而且減少前端模板文件的加載量 res.write(require('hogan').compile(s).render(datas)) 要比

    res.write(JSON.stringify(datas))快

  • 前端模板, 主要是部分需要ajax加載的部件

  • 剩下一個最難對付的就是SEO,對於不支持js的機器人,還是需要額外的一套非模板的代碼.

這個問題的焦點並不在“放在哪里渲染快”,如果你要考慮這個效率問題,那是不是也得同時思考下:

  • 后端渲染完了之后,需要進行網絡傳輸的體積大了,帶來的網絡損耗和網絡傳輸時間問題

很多場景,尤其是在移動端,我們通常不會把渲染工作交給后端,一方面后端渲染需要時間,一方面龐大的渲染數據傳輸也有時延,所以就會出現白屏問題。Bigpipe可以一定程度上處理這個問題,不夠構架成本略高,用的人偏少。 若把數據交給前端渲染,也存在一定的弊端,比如需求發生變化之后,接口需要調整,前端模板的解析也要跟着一起變化,這樣隔着一層接口開發,辦事效率就低了很多,因為我們至少要跟開發同學交涉。

nodejs 的出現讓模板復用方便了不少,很多時候,讓后端渲染一部分(比如首屏部分),后面的工作就交給前端異步去處理。兩者結合起來效果才是最佳的。

SEO問題嘛,看產品需求,很多產品優化了 SEO 也沒多大作用,如果實在要考慮:

  1. 可以使用 pjax / quickling / hash bang 等技術
  2. 服務器端根據 UA 輸出內容

不能簡單這么比吧,你這個測試只說明V8在你服務器環境上單次執行這個渲染的速度比PC快,但要知道服務器可是每個請求都執行渲染,影響的是全部用戶,而前端渲染只影響單機。 所以“后端吐首屏+前端渲染剩下的”是比較合適的辦法。


移動端,如果不是webapp,只需要發送數據就可以了.安卓和ios客戶端自己管理渲染.

對於PC端HTML內容的渲染,我還是比較建議Bigpipe推.

如果是采用ajax拉,那么頁面上每一個部件要多增加一個客戶端請求. 而請求帶來的請求體解析,本身是十分消耗服務器資源的.

比如一個網頁有3個部分,來自3個數據庫請求:

[用戶賬單] 
[用戶消息] 
[用戶文章]

如果是Bigpipe, 過程是這樣的:

客戶端請求
服務器發送布局HTML
服務器發送渲染過的<script>用戶賬單</script>
服務器發送渲染過的<script>用戶消息</script>
服務器發送渲染過的<script>用戶文章</script>
服務器發送HTML結束標簽</body></html>

只有1次服務器請求

如果是前端ajax渲染, 過程是這樣的:

客戶端請求
發送完整HTML布局頁
客戶端用戶賬單ajax請求
客戶端用戶消息ajax請求
客戶端用戶文章ajax請求
服務器發送用戶賬單數據
服務器發送用戶消息數據
服務器發送用戶文章數據

這個過程需要4次客戶端請求. 就算是把后3個ajax合並為一個ajax,也需要2個客戶端請求.


瀏覽器端渲染優點:

  • 分散服務端渲染時間到瀏覽器端
  • http response 大小也會減少
  • 對可維護性也有很大好處
    • 很容易搭建 前端獨立的開發環境
    • 減少了模板修改跟后端同步的問題

缺點就是:

  • seo
  • 首屏會有白屏
  • 最頭疼的一個問題可能是 業務邏輯的問題,因為很容易業務邏輯就跑到 js 來了

前端渲染的方式的話我覺得不一定是 bigpipe ,還要看場景;

對移動端上我覺得還是后端渲染好些,因為移動端上 cpu 還是要差些的,放到瀏覽器端渲染可能白屏時間更長一些


免責聲明!

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



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