首先,预编译跟前后端没有关系,预编译一样可以用于后端渲染。

看看下面的测试时间,单位: 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 还是要差些的,放到浏览器端渲染可能白屏时间更长一些

[转]谈谈前端渲染 VS 后端渲染的更多相关文章

  1. 前端路由、后端路由——想要学好vue-router 或者 node.js 必须得明白的两个概念

    前端路由和后端路由的概念讲解 引言 正文 一.路由的概念 二.后端路由 三.前端路由 四.其他知识 结束语 引言 无论你是正在学习vue 还是在学习node, 你一定会碰到前端路由和后端路由这两个概念 ...

  2. 后端渲染html、前端模板渲染html,jquery的html

    作者:赵魏璇链接:https://www.zhihu.com/question/28725977/answer/116177149来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  3. 【大前端之前后分离01】JS前端渲染VS服务器端渲染

    前言 之前看了一篇文章:@Charlie.Zheng Web系统开发构架再思考-前后端的完全分离,文中论述了为何要前后分离,站在前端的角度来看,是很有必要的:但是如何说服团队使用前端渲染方案却是一个现 ...

  4. avalon2的后端渲染实践

    avalon2为了提高性能,采用全新的架构,四层架构,其中一层为虚拟DOM. 虚拟DOM的一个好处是能大大提高性能,另一个好处是能过错整描述我们的页面结构.因此在非浏览器环境下,虚拟DOM也能正常运行 ...

  5. 细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)

    细说后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr) 前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr). 1. 后端 ...

  6. 理解Web路由(浅谈前后端路由与前后端渲染)

    1.什么是路由? 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 路由的概念最开始是由后端提出来的,在以前用模板引擎开发页面的时候,是使用路 ...

  7. 后端渲染神器!Dust

    Dust一个适用于浏览器与node的异步模板框架. 先上实例 后端模板: {@inject api="http://api.myserver.com/get_message"} & ...

  8. 前端基于react,后端基于.net core2.0的开发之路(1) 介绍

    文章提纲目录 1.前端基于react,后端基于.net core2.0的开发之路(1) 介绍 2.前端基于react,后端基于.net core2.0的开发之路(2) 开发环境的配置,注意事项,后端数 ...

  9. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...

随机推荐

  1. spark内存模型

    在spark里面,内存管理有两块组成,一部分是JVM的堆内内存(on-heap memory),这部分内存是通过spark dirver参数executor-memory以及spark.executo ...

  2. jQuery插件之ajaxFileUpload[转载]

    ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http:/ ...

  3. Spring MVC 3.0 深入及对注解的详细讲解[转载]

    http://blog.csdn.net/jzhf2012/article/details/8463783 核心原理 1.       用户发送请求给服务器.url:user.do 2.       ...

  4. 终于完成了 源码 编译lnmp环境

    经过了大概一个星期的努力,终于按照海生的编译流程将lnmp环境源码安装出来了 nginx 和php 主要参考 http://hessian.cn/p/1273.html mysql 主要参考 http ...

  5. 关于android im

    从各种pack中看到 环信 easemob.com  300万用户以下免费 org.jivesoftware.smackopenfireappkefu等开源im

  6. 【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码

    概述 spring MVC框架controller间跳转,需重定向,主要有如下三种: 不带参数跳转:形如:http://localhost:8080/SpringMVCTest/test/myRedi ...

  7. sersync基于rsync+inotify实现数据实时同步

    一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...

  8. OpenGL chapter5 基础纹理

    Chapter5 基础纹理 Contents: ==================================================== | 任务 | 使用的函数 ========== ...

  9. paycharm导入webdriver包报错:module 'selenium.webdriver' has no attribute 'Firefox'

    首先:试试看在cmd中试试输入from selenium import webdriver,看是否报错,看一看是不是pycharm的原因.经过确认,在dos窗口中输入导入包的命令并没有报错.最后我重现 ...

  10. selenium+python自动化98--文件下载弹窗处理(PyKeyboard)

    前言 在web自动化下载操作时,有时候会弹出下载框,这种下载框不属于web的页面,是没办法去定位的(有些同学一说到点击,脑袋里面就是定位!定位!定位!) 有时候我们并不是非要去定位到这个按钮再去点击, ...