后端渲染

avalon2的后端渲染实践

avalon2为了提高性能,采用全新的架构,四层架构,其中一层为虚拟DOM。

虚拟DOM的一个好处是能大大提高性能,另一个好处是能过错整描述我们的页面结构。因此在非浏览器环境下,虚拟DOM也能正常运行。并且avalon2自一开始,就努力隔离DOM API。基于这两点,avalon2可以原封不动地运行于nodejs中,进行定义VM,渲染视图等操作。

  1. 客户端上,虚拟DOM通过vm.$render方法渲染到页面中
  2. 服务端上,虚拟DOM使用serveRender生成HTML字符串

与react的后端渲染相比,它的使用是非常简单的。React的渲染单位是组件,组件有生命周期,我们在添加一些处理时,都是放在生命周期钩子中(getDefaultProps,getInitialState,componentWillMount,componentDidMount,componentWillUpdate。。。。),而在nodejs,生命周期只能走到componentDidMount之前。用户想后端渲染,需要有针对性地写代码。而avalon2则不需要懂这些,只要保证所有DOM操作在回调中就行了。

react的后端渲染有两个方法,ReactDOMServer.renderToString 和 ReactDOMServer.renderToStaticMarkup。renderToString带着uuid,为了前端只进行绑定事件,不再生成DOM,但缺点是让页面体积变大很多。而renderToStaticMarkup只能输入不带交互的静态页面。

而avalon只有一个方法,它输出的页面没有ms-xxx,:xxx这些绑定属性,因此相当于输出静态页面。为了实现绑定属性功能,如果将模板函数或已经生成好的事件传过去,想必体积太大。因此avalon将原始页面的很少一部分压缩传过去。即便你没有用html-minify这些工具,avalon也会做去空白节点处理!

因此从生成页面速度,与传输体积上,avalon的后端渲染都比react优秀不少。

与传统后端渲染相比,即JSP,PHP方案,主要好处是,模板的控制台掌握在我们前端手中。不要痛苦成为套页面的工具。avalon对切图人员交给我们的页面,所做修改是很少的,就是加一些绑定属性。

与近年流行前端模板渲染方案相比,即后端出数据,前端在script标签,textarea标签里写模板,主要好处是SEO!前端模板是无法搞定SEO,并且还有"首屏乱码"问题,这些在ng, avalon1, vue1 也有这问题,需要ng-cloak 等东西做遮丑布! 有了后端渲染就没有这问题了。

好了,我们看如何做。为简单起见,本文使用koa2做后端框架。koa2是使用es7的async function处理异步,从此告别异步地狱与那些深涩难懂的generators。

但就算最新的nodejs6也不支持async function,不过没关系,我们可以使用babel。至于如何用,后面直接给出一个例子。现在我们看一下一些通用的步骤,熟悉了它,你可以将avalon用于koa1, express及其他nodejs框架。

  1. 引入最新版 avalon 这里用avalon.modern体积少些
  2. 引入avalon仓库下的serve下的文件serveRender.js
  3. 引入你定义VM的文件 (所有DOM操作要在回调里进行,不要出现 window, document, 方便能在nodejs环境中运行) 对你的VM使用webpack进行打包 (目的是处理module.exports, require)
var vm = avalon.define({
  $id: "test",
  aaa: ‘222‘
})

module.exports = vm //这里必须使用module.exports,而不是es6 module
  1. 引入你该页面的模板(就是一个普通的HTML文件片段,里面需要用ms-controller,指向你刚才的VM.$id)
  2. 将VM与模板放进serveRender方法,得到一个对象,里面包含渲染好的HTML(A) 及 一个包括所有模板的对象(B)
  3. 创建一个script标签, 里面定义一个avalon.serverTemplates对象, 将B对象赋给它
  4. 将上面的标签与A页面, 赋给ctx.body发往前端(或其他可以放送到前端的方法里面去)
//1. 引入avalon
var vm = require(‘./src/avalon‘)
//2. 引入avalon的后端渲染器
var serveRender = require(‘./dist/serverRender‘)
//3. 当前页面VM
var vm = require(‘./src/vm‘)
//4. 当前页面模板
var test = fs.readFileSync(‘./src/aaa.html‘, ‘utf-8‘);

//5.
var obj = serveRender(vm, test)

//6.
var files = JSON.stringify(obj.templates)
var script = ‘<script src="./avalon.js"><\/script>‘ +
        ‘<script> avalon.serverTemplates= ‘ + files + ‘<\/script>‘ +
        ‘<script src="./test.js"><\/script>‘
//7. render
app.use(async function(ctx){
     await (ctx.body = script + obj.html)
})

这些我已经做成一个例子,放到GITHUB中,大家可以下回来看。

这是后端返回前端的源码,大家可以做得更漂亮些,把head, body, html等标签补上。不过就算你不写,浏览器也会帮你补上的。

这是效果图!

有了后端渲染,我们就可以加快首屏的渲染速度与SEO。 并且我们可以实现前后同构, 前后端共用一套模型(VM),一套验证代码,一套模板!!!做ABTest,埋点等也测试了!后端的一些部分也掌握在我们前端手中,我们的价值就越来越大,工资自然也上去了!

有关后端渲染的话题,大家也可以看一下react的方案及早期百度,腾讯基于它们的私有框架的实践。

    1. https://segmentfault.com/a/1190000004135256
    2. https://segmentfault.com/a/1190000005679938
    3. https://segmentfault.com/a/1190000005641012
时间: 2024-12-27 19:55:43

后端渲染的相关文章

前端渲染和后端渲染

一.前端渲染 定义:前端预定义好HTML,然后向后端请求数据,得到数据(XML.JSON等)后,通过JS去加载数据. 优点:节省网络流量,利于SEO,节省部分服务器资源. 缺点:前端处理数据费时,可能造成假死等. 举例:EasyUI 二.后端渲染 定义:在后端就渲染好HTML页面,直接发送给浏览器显示. 优点:前端页面加载迅速,无数据处理过程. 缺点:占用服务器资源.网络数据耗费大. 举例:FreeMaker,Velocity,JSP PS:之前在学习JSP等模板引擎的时候听到纯前端朋友提到了通

后端渲染实践——看掘金社区是如何实践的

Vue.js.React.js 及 Angular.js 等等前端开发框架引入了 UI = framework(State) 的前端编程逻辑,大范围降低了前端业务开发的难度,尤其是面向复杂前端应用.而这些优质开源框架的普及.多端业务统一.前后端分离的需求让越来越多的架构设计将大部分业务逻辑写在了前端. 但是,纯前端产品也有着它的问题.上述的几个前端框架都支持了后端渲染的功能,从而融合了前后端的问题.如何有效地整合现有前端逻辑实现后端渲染.如何优化后端渲染性能.如何实现服务器流式吐内容更快地渲染页

[转]谈谈前端渲染 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

前后端渲染的区别

后端渲染:在服务器进行渲染,服务器进程从数据库获取数据后,利用后端模板引擎,甚至是在HTML模板中嵌入后端语言(例如JSP), 将数据加载进来生成HTML,通过网络传输到用户的浏览器中,再被浏览器解析成可见的页面. 1.对于搜索引擎很友好. 2.首页加载的时间短,后端渲染加载完成后就直接显示HTML,但是前端渲染在加载完成后还需要有段js渲染时间. 前端渲染:在浏览器里利用JS把数据和HTML模板进行组合. 1.业务分离,后端只需要提供数据接口,前端在开发时不需要部署对应的后端环境,通过一些代理

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

1.什么是路由? 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 2.router 和 route 的区别 route就是一条路由,它将一个URL路径和一个函数进行映射,例如: /users -> getAllUsers() /users/count -> getUsersCount() 这就是两条路由,当访问 /users 的时候,会执行 getAllUsers() 函数:当访问 /users/count 的时候,会执行 getUs

前后端渲染

静态HTML指:使用单纯的HTML或者结合CSS制作的包括图片.文字等的只供用户浏览但不包含任何脚本.不含有任何交互功能的网页. 动态的HTML指:网页不仅提供给用户浏览,网页本身还有交互功能,存在着在脚本如JAVASCRIPT,并利用某种服务器端语言如PHP等实现如用户注册,用户登录,上传文件,下载文件等功能,动态页面可以人机互动,静态只能回服务器的数据库再回到页面 后端渲染(SSR.服务端渲染)后端渲染HTML的情况下,浏览器会直接接收到经过服务器计算之后的呈现给用户的最终的HTML字符串,

nodejs之利用第3方包,做数据库操作、登录页面验证案例(案例中的动态页面都是基于后端渲染的)

1.先安装第3方包 新建项目文件夹->建入口js文件->npm init 创建包管理文件 package.json ->npm install mysqljs/mysql 2.在项目入口文件来做数据库操作(数据库操作语句,其实可以去npm官网查看这个masql插件的文档) 真实的工作场景中,数据库位于一台单独的服务器上 3.mysql的sql语句的学习   4.封装操作数据库的api 5.登录页面小案例---走通前端+后端+数据库一套流程 原文地址:https://www.cnblogs

谈谈渲染,玩玩nginx——前后端分离,转发请求到Tomcat的尝试

一.谈谈"渲染" 相信好多人都挺听过"渲染"这个词,但不清楚它是什么意思?前端开发以为这是后端的活儿,后端开发以为是前端的事儿,推着推着就不了了之.其实渲染很简单,不说概念,直接举例: 1. 后端渲染:以JSP为例,可以分成三步 a.编写标签或Java代码(可以称之为模板) b.在JSP编译阶段被转换成Servlet编译为Servlet Class c.执行编译后的代码,将响应(模板执行结果)返回给页面 优势:减少前端工作,前端只需要设计纯页面,其他的都由后端来做:

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

细说后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr) 前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr). 1. 后端模板渲染 前端与后端最初的渲染方式是后端模板渲染,就是由后端使用模板引擎渲染好 html 后,返回给前端,前端再用 js 去操作 dom 或者渲染其他动态的部分. 这个过程大致分成以下几个步骤: 前端请求一个地址 url 后端接收到这个请求,然后根据请求信息,从数据库或者其他地方获取相应的数据 使用