细说后端模板渲染、客户端渲染、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的好机会,准备好迎接即将到来的前端工程化 ...
随机推荐
- C#是唯一能挑战Java的编程语言?
几乎所有新近成长的Visual Studio代码开发人员都选择使用C#,而不是VB.NET或C++,这也使得C#已经成长为微软的第一大语言.根据本月的Tiobe编程语言排行榜,C#再次取得了突破性进展 ...
- C++面试试题汇总1
1.C和C++的主要区别是什么? 答:1.C++语言包括过程性语言部分和类部分,过程性语言部分与C并无本质的差别,类部分是C语言中所没有的,它是面向对象程序设计的主体. 2.程序设计方法上已从结构化程 ...
- Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental……
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...
- 性能指标 - OEE
work center 是指 执行制造作业的资源, 可以是 一个人, 一组人, 一台自动机器, 一组自动机器, 一个半自动机器, 一组半自动机器, 或者是 一个区域组成的生产资源 基本参数 Time ...
- merge-sorted-array——合并两个有序数组
Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume th ...
- Java 线程第三版 第五章 极简同步技巧 读书笔记
一.能避免同步吗? 取得锁会由于下面原因导致成本非常高: 取得由竞争的锁须要在虚拟机的层面上执行很多其它的程序代码. 要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 ...
- 一些Python黑客脚本
[Github项目地址] https://github.com/threeworld/Python
- 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法
ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...
- Anaconda2
Anaconda 是一个打包的python,一次把好多需要的包都安装好了.对于Python2.7把PyQt5都弄好了,不需要自己来编译! 看看这个 http://conda.pydata.org/do ...
- FTP匿名登录或弱口令漏洞及服务加固
漏洞描述 FTP 弱口令或匿名登录漏洞,一般指使用 FTP 的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母等,容易被黑客攻击,发生恶意文件上传或更严重的入侵行为. ...