操作DOM会影响WEB应用的性能
平时在工作中,要优化自己开发的WEB应用的性能,一般是遵循以下几个原则:
1.减少网络请求。
2.压缩、合并静态资源文件,以此来减轻网络传输的带宽压力和资源消耗。
3.代码逻辑层面上的性能优化、比如减少循环次数、减少DOM操作的次数(减少DOM的获取与修改次数)等。
这里就来讲一下为什么DOM操作会影响WEB应用的性能。
DOM与ES的关系
DOM(Document Object Model,文档对象模型)是一个独立于语言的、用于操作XML和HTML文档的程序接口(API),我们可以通过调用其中的方法函数并传入指定的参数来使用。DOM在浏览器中主要用于与HTML文档打交道,并且使用DOM API来访问文档中的数据。DOM是个与ES语言无关的API,它在浏览器中的接口却是用JavaScript来实现的,因此DOM就成了现在JS编码中的重要部分。
在各大浏览器中,DOM的位置与JavaScript的位置是相互独立的(渲染引擎与JS引擎相互独立)
| 浏览器 | JS位置 | DOM位置 |
|---|---|---|
| IE | JavaScript的实现名为JScript,位于jscript.dll文件中 | DOM的实现则存在另一个库中,名为mshtml.dll(内部称为trident) |
| safari | JavaScript部分是由独立的SquirelFish引擎来实现。 | DOM和渲染是使用webkit中的webcore实现 |
| google chrome | JavaScript引擎是他们自己研发的,名为V8。 | 使用webkit中的webCore库来渲染页面 |
| firefox | JavaScript引擎名为TraceMonkey | 渲染引擎Gecko |
ES操作DOM需要消耗性能
ES是通过DOM接口来获取文档中的元素的,正因为浏览器中通常把DOM和ECMAScript独立实现,使得二者相互独立,就像两座孤岛,所以ES每次操作DOM时,ES和DOM之间就像两个孤岛之间需要建立连接。而每次连接就都需要搭建一个桥梁,搭桥还是小事,ES请求DOM的车辆过桥时,会经过一个收费站,每次都会被收费,需要JS引擎消耗浏览器的性能进行缴费。而车辆通过后桥就会被销毁,等到下次连接又要重新搭桥二次缴费,所以说JS与DOM之间的每次连接都需要消耗性能 。当然了,浏览器引擎实际上也有相应的应对优化措施,具体是产生一个临时队列存放ES对DOM的操作指令,相当于批量操作DOM,即在一次连接中进行多个DOM操作,一定程度上也优化了性能。
另外,每次操作DOM都需要先对DOM进行访问,这样也会消耗性能。在此基础上,因为修改DOM又会导致浏览器重新计算页面的几何变化,引发浏览器模板引擎的重排(回流-回滚流程)和重绘,进而更加消耗性能。也正因此,所以就有了每操作一次DOM就多做点事的理念。即尽可能以最少的次数处理最多的DOM操作,以实现每过一次桥多拉点货的效果。特别提及一下,VUE也正是这种理念,即操作虚拟DOM减少性能消耗,因此VUE性能优异。
浏览器的渲染引擎的步骤
浏览器下载完页面中的所有资源(比如HTML、JavaScript、CSS、图片等)后,会发生如下的6步过程:
1.解析HTML,构建DOM树(DOM Tree)。
2.解析CSS,生成CSS规则树(CSSOM Tree)。
3.合并DOM树和CSS规则树,生成渲染树render树(render Tree)。
4.布局render树,根据生成的render树来对各元素尺寸、位置进行计算,得到每个节点的几何信息。(根据视口的大小来计算元素的位置和大小)(重排会走这一步)。
5.绘制render树,绘制页面像素信息(根据render树上每个节点的几何信息,得到每个节点的像素数)(重绘会走这一步)。
6.浏览器将各层节点的像素信息发送给GPU,GPU将各层合成、绘制展示到页面上。
浏览器渲染引擎的重排和重绘
重排
当DOM的变化影响了元素的几何属性(宽和高),浏览器需要重新计算元素的几何属性,同样其他相邻元素的几何属性和位置也会因此受到影响。浏览器会使渲染树中受到影响的部分失效,并重新构造渲染树。这个过程被称为重排。
换句话说,改变了页面中某元素的位置、尺寸大小,进而也就改变了他的占地面积。那这个元素修改了占地面积后,其后紧邻的元素就得挪动位置。给她让地儿(或者向前赶赶)。紧邻的元素挪动了,那紧邻元素后边的元素也会连锁效应式的修改。这就好比一排人排队。前边的人突然变胖了、变瘦了、向前挪了、向后挤了、都会导致队伍中后边的人也跟随之改变位置,由此导致一连串的人都挪动位置。这时浏览器就要重新排版各个受到影响的元素的位置。反映在渲染引擎的工作流程中也就是浏览器需要重新计算元素位置信息并布局render树,这就是重排。
重排会占用和消耗CPU资源,影响性能。
重绘
完成重排后,浏览器会重新绘制受影响的部分到屏幕中,该过程称为重绘。
因为重排在重绘的上一步,所以重排发生后自然会导致重绘。
重绘会占用和消耗GPU资源,影响性能。
总结
综合上面来说,这里简单总结一下为什么操作DOM会影响WEB应用的性能。
1.ES和DOM是相互独立的两个个体,它们之间的每次连接都需要消耗性能。
2.操作DOM会导致重排和重绘。重排会占用和消耗CPU,重绘则会占用和消耗GPU。
因此,在开发过程中我们要尽量减少操作DOM。
"相对于一眼望不到头的日子,有的人更愿意选择一眼能望到头的日子。"
操作DOM会影响WEB应用的性能的更多相关文章
- 为什么操作DOM会影响WEB应用的性能?
面试官经常会问你:"平时工作中,你怎么优化自己应用的性能?" 你回答如下:"我平时遵循以下几条原则来优化我的项目.以提高性能,主要有:" a. 减少DOM操作的 ...
- 操作dom影响性能的原因
为什么dom操作会影响性能? 在浏览器当中,dom的实现和ECMAScript的实现是分离的. 例如,在IE中,ECMAScrit的实现在jscript.dll中,而DOM的实现在mshtml.dll ...
- 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM
前端性能优化--为什么DOM操作慢? 作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...
- 记录一下前端性能优化-为何操作DOM会变慢?
对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩(css.js.图片皆可压缩) 样式表放头部,脚本放底部 使用CDN(这部分, ...
- web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记
hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...
- H5 缓存机制浅析 移动端 Web 加载性能优化
腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...
- 移动 H5(PC Web)前端性能优化指南
原文地址https://zhuanlan.zhihu.com/p/25176904?utm_source=wechat_session&utm_medium=social&utm_me ...
- mui项目中如何使用原生JavaScript代替jquery来操作dom 转自【B5教程网】:http://www.bcty365.com/content-146-3661-1.html
最近在用mui写页面,当然了在移动App里引入jq或zepto这些框架,肯定是极不理性的.原生JS挺简单,为何需要jq?jq的成功当时是因为ie6.7.8.9.10.chrome.ff这些浏览器不兼容 ...
- Web标准中用于改善Web应用程序性能的各种方法总结
提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...
随机推荐
- SpringBoot:实现定时任务
一.定时任务实现的几种方式: Timer 这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执 ...
- 06 css选择器
选择器的作用:选中标签 1.基本选择器 标签选择器 id选择器 class选择器 *通配符选择器 权重:行内样式 1000 > id选择器 100 > 类选择器10 > 标签选择器 ...
- MySQL里的COUNT
count(*).count(1).count(主键).count(字段)的执行效率 在没有where条件的情况下 MyISAM引擎返回结果会比InnoDB快上很多,主要是因为MyISAM会单独记录了 ...
- AVL-平衡二叉树的原理和实现
一.简介 本文将通过图解和代码详细讲解AVL平衡二叉树的性质及失衡和再平衡的内容.在看本文之前希望大家具备二分搜索树的相关知识.或移步<二分搜索树>了解二分搜索树. 二.平衡二叉树 前面关 ...
- d3.js制作蜂巢图表带动画效果
以上是效果图,本图表使用d3.js v4制作.图表主要功能是在六边形格子中显示数据,点击底部图标可以切换指定格子高亮显示,图表可以随浏览器任意缩放. 1.图表的主体结构是由正六边形组成,使用d3生成六 ...
- 在 Web 级集群中动态调整 Pod 资源限制
作者阿里云容器平台技术专家 王程阿里云容器平台技术专家 张晓宇(衷源) ## 引子 不知道大家有没有过这样的经历,当我们拥有了一套 Kubernetes 集群,然后开始部署应用的时候,我们应该给容器分 ...
- urllib爬虫模块
网络爬虫也称为网络蜘蛛.网络机器人,抓取网络的数据.其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好.一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务 ...
- 利用Spring Boot+zxing,生成二维码还能这么简单
在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付.网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类. 本文目录 一.二维码简介二. ...
- Android Studio安卓学习笔记(三)Android用户界面的设计布局与组件(一)用户界面布局设计(1)
当我们创建了一个安卓项目后,我们会发现真正建立一个完善的安卓项目并不是想象的那么容易.其实和设计GUI可视化界面一样,开发安卓也需要考虑很多方面,主要考虑的还是界面布局和需要的组件. 一:Androi ...
- 本地搭建持续集成(AzureDevops)
下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 首先你需要SQL2017以上版本 ,不支持以下版本 完成下载之后进行安装(可选中文 ...