1、什么是DOM渲染?

  所谓的DOM渲染是指的是对于浏览器中展现给用户的DOM文档的生成的过程。

2、DOM渲染的过程,大致可以分为三个阶段:

  ——纯后端渲染

  ——纯前端渲染

  ——服务端的JS渲染结合前端渲染

下面我们分阶段来做一下说明。

第一个阶段是纯后端渲染。采用这样的渲染方式,就是每一个页面中,在Chrome中展开得到的DOM,和服务器返回的DOM是基本一致的(可以通过查看网页源代码来得到服务器返回的DOM)。当然,这里是“基本”一致,因为实际操作中,页面或多或少还是会带有一些js代码,并且在浏览器端中运行这些js代码来对DOM进行的渲染,不过这一部分js代码并不影响DOM的主体是由服务端返回的。纯后端的DOM渲染,DOM树的生成完全是在后端服务器中完成的,相当于后端服务器的程序会把各种的数据拼成一个DOM树,并转换成一个字节流作为HTTP Response的body返回给浏览器。这种渲染的逻辑如下图所示

纯后端的渲染的整体的结构是最简单的,把全部的逻辑都交给后端来完成。这样的优点在于返回的HTTP Response是包含着全部页面内容的,相对来说页面的主体DOM结构都会在这个响应中返回,可以让用户更快的看到页面的主体部分,而这样的响应对于浏览器爬虫来说也更有好,对SEO更有帮助。但是也正是由于这样的简单的结构,如果返回的DOM比较复杂,尤其是带有复杂的交互的页面,开发的难度就会非常大,或者说纯后端渲染很难带来良好的交互体验。当然,在纯后端DOM渲染中,地址的路由完全是由后端控制的(最简单的例子就是有后端直接把服务器上的静态目录结构返回回来),每一次路由发生变化,都会引起页面的刷新,这个使用体验其实也不是很好。

btw,我们现在一般提到的“页面”这个概念或者说法,就是在纯后端DOM渲染的阶段中形成并且延续下来的。在纯后端的渲染中,可以很清晰的把一次DOM类型的HTTP请求作为一个页面。但是在后两种方式中,这个分界就远远么有这么清晰了,前端框架只是实现了类似的“页面”的效果,但是就不一定和某个具体的请求机制直接挂钩了。

第二个阶段就是纯前端渲染,很大程度上,纯前端渲染可以解决纯后端渲染中出现的各种体验问题。如下图所示,纯前端渲染把DOM生成的主题逻辑都放在了前端,这时后端只会返回一个框架的DOM结构,比如只带一个容器元素的的DOM,然后由js代码把页面的主题渲染到这个容器元素中。

在纯前端DOM渲染中,服务器主要是以API的形式返回各种数据,然后由js把数据重新组合成DOM。的大家耳熟能详的各种前端框架,比如Vue.js,React.js,angularjs等等,主要都是以这种方式完成了对于DOM的渲染。相对于纯后端的DOM渲染方式,纯前端DOM渲染的方式形成了一个天然的表现层和数据层的分界,js代码负责交互和展现,后端以API形式提供纯粹的数据。这种改变带来的最大的好处就是,交互的部分可以脱离数据接口独立的开发和调试,让站点的交互能力大幅的提升,并且很好的解耦了表现层和数据层的代码逻辑。

在纯前端DOM渲染中,第一屏的DOM渲染,依赖于大量的前端代码的加载和一次到多次的API请求。请求本身处理的时间,加上http请求的round trip的时间,这就会让第一屏的渲染之前有很多工作要做,并且每一步工作都带着从用户的网络到服务器网络的访问延迟,如果用户到服务器的物理距离很远,这个延迟累加起来就会很大。很多优化的方法,比如控制max-age等缓存时间,通过MANIFEST来储存静态资源等,都是针对用户第二次加载第一屏来进行的,无法解决用户第一次加载第一屏的问题。

下面我们就看一下第三个阶段,服务端的js渲染结合前端渲染,如下图所示

可以说,这里是把纯前端渲染划分成了两个渲染的子阶段。第一个子阶段即SSR初步渲染完成DOM,也就是把我们上面说到的第一屏先在服务器端通过js渲染出来,这个子阶段在服务器端增加了一个js渲染层的服务(比如next.js和nuxt.js),这一层相当于把原来要在客户网络与服务器网络之间进行的大量通信转移到了由服务器网络与服务器网络之间进行,大大缩减了网络通信消耗的时间。第二个子阶段就是前段渲染的阶段,主要是解决首屏加载之后用用户交互问题,这些都和纯前端渲染时完全一致的。

第三个阶段,主要是把前两个阶段中,一些交给纯后端DOM渲染逻辑分离的不好,但是交给纯前端DOM渲染又会造成较高延迟的部分单独分离出来形成了一独立DOM渲染阶段,保留的代码中天然的展示层和数据层的分离,又把API请求的累计延迟减少了很多,从SEO角度来说渲染结果对搜索引擎也很友好。当然,这样的做法需要给整体的架构增加一个独立的单元,给开发和部署都带来了更高复杂性。

本文提到的DOM渲染的三种方式,虽然第三个阶段最适于提供最优的使用体验,但不一定实际开发中最佳的方式,在特定的场景下,可以根据场景的特性来选择最简单的方法来完成。比如在网络延迟很低的情况下(内部网络),就没有必要选取服务器端js渲染的方式,纯前端渲染就可以带来低延迟的使用体验。

原文:https://blog.csdn.net/gstianfu/article/details/82142145

传统的DOM渲染方式?的更多相关文章

  1. 传统的DOM渲染方式

    什么是DOM渲染: DOM渲染是浏览器展现给用户的DOM文档的生成的过程. DOM渲染的演化过程: ①纯后端渲染 ②纯前端渲染 ③服务端的js渲染结合前端渲染 纯后端渲染:DOM树的生成完全是在后端服 ...

  2. 传统的dom的渲染方式

    DOM渲染的过程大致分为三个阶段: 后端渲染 前端渲染 独立DOM渲染(前后端相结合渲染) 1.后端渲染:DOM树的生成完全是在后端服务器中完成的,后端服务器的程序会把需要的数据拼合成一个类似于前端D ...

  3. 前端之:传统的DOM是如何渲染的?

    a.纯后端渲染:页面发送请求,后端服务器中将数据拼成完整DOM树,并转换成一个字节流作为HTTP Response的body返回给浏览器.优点在于 返回的HTTP Response是包含着全部页面内容 ...

  4. Javascript:再论Javascript的单线程机制 之 DOM渲染时机

    Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJA ...

  5. vue2.0的虚拟DOM渲染

    1.为什么需要虚拟DOM 前面我们从零开始写了一个简单的类Vue框架(文章链接),其中的模板解析和渲染是通过Compile函数来完成的,采用了文档碎片代替了直接对页面中DOM元素的操作,在完成数据的更 ...

  6. Vue(4)- 获取原生的DOM的方式、DIY脚手架、vue-cli的使用

    一.获取原生的DOM的方式 在js中,我们可以通过id.class或者标签获取DOM元素,vue中也为我们提供了获取原生DOM的方法,就是给标签或者组件添加ref属性,通过this.$refs获取,如 ...

  7. Vue 4 -- 获取原生的DOM的方式、DIY脚手架、vue-cli的使用

    一.获取原生的DOM的方式 在js中,我们可以通过id.class或者标签获取DOM元素,vue中也为我们提供了获取原生DOM的方法,就是给标签或者组件添加ref属性,通过this.$refs获取,如 ...

  8. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  9. document.compatMode(判断当前浏览器采用的渲染方式)

    转载自:http://www.cnblogs.com/fullhouse/archive/2012/01/17/2324706.html IE对盒模型的渲染在 Standards Mode和Quirk ...

随机推荐

  1. windows10源码编译llvm

    准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...

  2. 二叉树c++实现

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 二叉树特点: 要么为空树:要么,当前结点的左孩子比当前结点值小,当前 ...

  3. c++ 之面试题(3)数组递归查找

    题目描述 1. 给定严格升序(没有相等元素)的数组a,元素个数为cnt, 查找num在数组中的位置序号(以0位起始). 如果没找到则返回: 比num小且最靠近的元素位置序号. 若所有元素均大于num则 ...

  4. Sufficient Statistic (充分统计量)

    目录 定义 充分统计量的判定 最小统计量 例子 Poisson Normal 指数分布 Gamma Sufficient statistic - Wikipedia Sufficient statis ...

  5. Kernel Methods for Deep Learning

    目录 引 主要内容 与深度学习的联系 实验 Cho Y, Saul L K. Kernel Methods for Deep Learning[C]. neural information proce ...

  6. java-git 暂存

    在接到需求以后,直接在master上开发了,到提交的时候才想起来忘记新建版本分支了,直接提交到master会影响到其他人. 这时候就想着将本地编辑的代码,没有提交的代码暂存起来,然后新建一个新分支,再 ...

  7. Vue的安装及使用(Vue的三种安装使用方式)

    vue是一个JavaMVVM库,是一套用于构建用户界面的渐进式框架,是初创项目的首选前端框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计.它是轻量级的,它有很多独立的功能或库,我们 ...

  8. 微信小程序--数据共享与方法共享

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 1. 全局数据共享 2. 小程序中的全局数据共享方案 3. 使用mobx ...

  9. vue3.0 没有 vue.condig.js 解决

    第一次用 vue3.0 ,发现没有vue.config.js  ,只有一个babel.config.js 怎么办? 需要在根目录手动添加一个即可,如下 相关的配置说明 module.exports = ...

  10. js- float类型相减 出现无限小数的问题

    6.3 -1.1 是不是应该等于5.2? 但是js 会导致得出 5.19999999999的结果 怎么办?可以先先乘100 后相减,然是用方法 舍入为最接近的整数,然后再除于100, Math.rou ...