细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)
细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)
前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)。
1. 后端模板渲染
前端与后端最初的渲染方式是后端模板渲染,就是由后端使用模板引擎渲染好 html 后,返回给前端,前端再用 js 去操作 dom 或者渲染其他动态的部分。
这个过程大致分成以下几个步骤:

- 前端请求一个地址
url - 后端接收到这个请求,然后根据请求信息,从数据库或者其他地方获取相应的数据
- 使用模板引擎(如
java > jsp、php > smarty)将这些数据渲染成html - 将
html文本返回给前端
在这个过程中,前端的 html 代码需要嵌入到后端代码中(如 java、php),并且在很多情况下,前端源代码和后端源代码是在一个工程里的。
所以,不难看出,这种方式的有这样的几个不足:
- 前后端杂揉在一起,不方便本地开发、本地模拟调试,也不方便自动化测试
- 前端被约束在后端开发的模式中,不能充分使用前端的构建生态,开发效率低下
- 项目难以管理和维护,也可能会有前后端职责不清的问题
尽管如此,但因为这种方式是最早出现的方式,并且这种渲染方式有一个好处,就是前端能够快速呈现服务器端渲染好的页面,而不用等客户端渲染,这能够提供很好的用户体验与 SEO 友好,所以当下很多比较早的网站或者需要快速响应的展示性网站仍然是使用这种方式。
2. 客户端渲染
随着前端工程化与前后端分离的发展,以及前端组件化技术的出现,如 react、vue 等,客户端渲染已经慢慢变成了主要的开发方式了。
与后端模板渲染刚好相反,客户端渲染的页面渲染都是在客户端进行,后端不负责任何的渲染,只管数据交互。
这个过程大致分成以下几个步骤:

- 前端请求一个地址
url - 后端接收到这个请求,然后把相应的
html文件直接返回给前端 - 前端解析
js后,然后通过ajax向后台获取相应的数据 - 然后由
js将这些数据渲染成页面
这样一来,前端与后端将完全解耦,数据使用全 ajax 的方式进行交互,如此便可前后端分离了。
其实,不难看出,客户端渲染与前后端分离有很大的好处:
- 前端独立出来,可以充分使用前端生态的强大功能
- 更好的管理代码,更有效率的开发、调试、测试
- 前后端代码解耦之后,能更好的扩展、重构
所以,客户端渲染与前后端分离现在已经是主流的开发方式了。
但这种方式也有一些不足:
- 首屏加载缓慢,因为要等
js加载完毕后,才能进行渲染 - SEO 不友好,因为
html中几乎没有可用的信息
3. node 中间层
为了解决客户端渲染的不足,便出现了 node 中间层的理念。
传统的 B/S 架构中,是 浏览器 -> 后端服务器 -> 浏览器,上文所讲的都是这种架构。
而加入了 node 中间层之后,就变成 浏览器 -> node -> 后端服务器 -> node -> 浏览器。
这个过程大致分成以下几个步骤:

- 前端请求一个地址
url - node 层接收到这个请求,然后根据请求信息,向后端服务器发起请求,获取数据
- 后端服务器接收到请求,然后根据请求信息,从数据库或者其他地方获取相应的数据,返回给 node 层
- node 层根据这些数据渲染好首屏
html - node 层将
html文本返回给前端
一个典型的 node 中间层应用就是后端提供数据、node 层渲染模板、前端动态渲染。
这个过程中,node 层由前端开发人员掌控,页面中哪些页面在服务器上就渲染好,哪些页面在客户端渲染,由前端开发人员决定。
这样做,达到了以下的目的:
- 保留后端模板渲染、首屏快速响应、SEO 友好
- 保留前端后分离、客户端渲染的功能(首屏服务器端渲染、其他客户端渲染)
但这种方式也有一些不足:
- 增加了一个中间层,应用性能有所降低
- 增加了架构的复杂度、不稳定性,降低应用的安全性
- 对开发人员要求高了很多
4. 服务器端渲染(ssr)
大部分情况下,服务器端渲染(ssr)与 node 中间层是同一个概念。
服务器端渲染(ssr)一般特指,在上文讲到的 node 中间层基础上,加上前端组件化技术在服务器上的渲染,特别是 react 和 vue。
react、vue、angular 等框架的出现,让前端组件化技术深入人心,但在一些需要首屏快速加载与 SEO 友好的页面就陷入了两难的境地了。
因为前端组件化技术天生就是给客户端渲染用的,而在服务器端需要被渲染成 html 文本,这确实不是一件很容易的事,所以服务器端渲染(ssr)就是为了解决这个问题。
好在社区一直在不断的探索中,让前端组件化能够在服务器端渲染,比如 next.js、nuxt.js、razzle、react-server、beidou 等。
一般这些框架都会有一些目录结构、书写方式、组件集成、项目构建的要求,自定义属性可能不是很强。
以 next.js 为例,整个应用中是没有 html 文件的,所有的响应 html 都是 node 动态渲染的,包括里面的元信息、css, js 路径等。渲染过程中,next.js 会根据路由,将首页所有的组件渲染成 html,余下的页面保留原生组件的格式,在客户端渲染。
5. 另外
- 不需要首屏快速加载、SEO 友好的,用全客户端渲染
- 需要首屏快速加载、SEO 友好的,如果用了如
react、vue等组件化技术,将不得不用 node 中间层与服务器端渲染 - 如果技术团队不支持,不建议在需要首屏快速加载、SEO 友好的地方使用如
react、vue等组件化技术 - 前后端分离之后也可以做后端模板渲染,这样前端的调试可以搭配 handlebars、ejs 等模板引擎进行本地调试,而后端的调试则需要到测试机了
后续
更多博客,查看 https://github.com/senntyou/blogs
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)的更多相关文章
- 基于vue现有项目的服务器端渲染SSR改造
前面的话 不论是官网教程,还是官方DEMO,都是从0开始的服务端渲染配置.对于现有项目的服务器端渲染SSR改造,特别是基于vue cli生成的项目,没有特别提及.本文就小火柴的前端小站这个前台项目进行 ...
- node服务端渲染(完整demo)
简介 nodejs搭建多页面服务端渲染 技术点 koa 搭建服务 koa-router 创建页面路由 nunjucks 模板引擎组合html webpack打包多页面 node端异步请求 服务端日志打 ...
- 【大前端之前后分离01】JS前端渲染VS服务器端渲染
前言 之前看了一篇文章:@Charlie.Zheng Web系统开发构架再思考-前后端的完全分离,文中论述了为何要前后分离,站在前端的角度来看,是很有必要的:但是如何说服团队使用前端渲染方案却是一个现 ...
- 浅谈 Web 中前后端模板引擎的使用
前言 这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore _.template 方法源码后,觉得还是有必要记下此 ...
- 基于React服务器端渲染的博客系统
系统目录及源码由此进入 目录 1. 开发前准备 1.1 技术选型1.2 整体设计1.3 构建开发 2. 技术点 2.1 react2.2 redux, react-router2.3 server-r ...
- node中间层
node中间层 一.总结 1.node中间层作用:前端也是mvc,NodeJS之后,前端可以更加专注于视图层,而让更多的数据逻辑放在Node层处理 2.node中间层作用:当发现所有请求量太多应付不过 ...
- webpack4+koa2+vue 实现服务器端渲染(详解)
_ 阅读目录 一:什么是服务器端渲染?什么是客户端渲染?他们的优缺点? 二:了解 vue-server-renderer 的作用及基本语法. 三:与服务器集成 四:服务器渲染搭建 4.1 为每个请求创 ...
- React 服务器端渲染流程
其实我们在访问客户端渲染的页面时,请求到的只是一个 html 空壳,里面引入了一个 js 文件,所有的内容都是通过 js 进行插入的,正是因为页面是由 js 渲染出来的,所以会带来如下几个问题: 1. ...
- Node中间层浅认知
Node中间层允许前端来做网站路由.页面渲染.SEO优化,对以往从来不接触这些内容的前端选手来说,正是锻炼我们网站架构的好机会.另外,这也是一次深入了解Node的好机会,准备好迎接即将到来的前端工程化 ...
随机推荐
- linuxshell编程之变量
变量分类: 用户自定义变量:局部变量 定义格式:变量名=变量值(*等号左右不能有空格,加了空格会报错) 调用格式:echo $变量名(调用的是变量名等效的值) 变量叠加:$x=123,y=" ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同一时候带着刚体
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- 2016.12.5 在Eclipse中为实现类impl自动生成对应接口
参考来自:http://jingyan.baidu.com/article/ab69b270d63f572ca6189f51.html 在Spring应用中,常常会用到“接口+实现类”的形式,即要实现 ...
- linux中grep注意
grep -l 只输出文件名: -h 只输出匹配的行 不输出文件名: -c 之处匹配内容的行数: -n 将结果输出的同时,也输出改行的行号: -c 统计查到的总行数: -i 忽略大小写: grep ' ...
- HTML5 Canvas 绘制星条旗
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- 新版本号的tlplayer for android ,TigerLeapMC for windows公布了
tlplayer for android 新版本号修正了图像倾斜等等问题,添加了动态水印功能. 支持hls(m3u8),http,rtsp,mms,rtmp等网络协议. 声明tlplayer 上的变速 ...
- vuex mapState使用
<template> <div> {{count}} <button @click="handleIncrease">+5</button ...
- QTreeWidget里嵌套表格QTableView
InformationPositionSubTableView::InformationPositionSubTableView(QStringList& columnNameList,QLi ...
- NoSQL数据库的分类
- cenos7 修改hostname
hostnamectl set-hostname Linuxidc 如何在CentOS 7上修改主机名 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵 ...