文章目录

  • 一、什么是web的性能优化
  • 二、web性能优化的目的
  • 三、web性能优化的原理
    • 3.1 加载文档
    • 3.2 生成dom树
    • 3.3 加载css 和js
    • 3.4 生成CSS OM
    • 3.5 rending tree
    • 3.6 layout(flow 、reflow)
    • 3.7 paint(repaint)
    • 3.8 composite (合并)
  • 四、性能优化
    • 4.1 html的语义化编程
    • 4.2 资源的加速
    • 4.3 js的优化
    • 4.4 CSSOM 优化
    • 4.5 dom操作节流
    • 4.6 加载渲染分流
    • 4.7 避免repaint和reflow

一、什么是web的性能优化

web的性能指标有很多,大致可以分为三类:

  1. 首次访问速度。首次访问速度主要指首页的加载速度,这个在移动端显得尤为可贵,对于大厂的h5 app,这一块的优化一直都是头疼的问题,例如淘宝首页,手百首页等等,让用户多看几百毫秒的白屏,都会让pm逼死一帮程序猿。
  2. 持续访问速度。持续访问速度更多指对于CPU,GPU,内存等资源的使用,使用过程中的是否有卡顿,是否保持流畅等等。
  3. web的健壮性。健壮是指,对于对于并发,大量请求和访问,web安全等等极端情况下web的可用性。

这次我们要讲的是主要是第一点,首次加载时,web性能的优化,这也是一版前端面试会的常考点。之后的web 性能优化均指的是第一点。

二、web性能优化的目的

  1. 优化用户体验,提升用户留存率。有人研究过:2秒之内,95%以上的实验者保持良好的注意力,3秒之后注意力开始分散;当等待时间超过5秒,70%的实验者能保持良好的注意力;当等待时间超过9秒,仅剩下20%能保持良好的注意力,对于不同首屏加载等待时间对于用户的留存,每个大厂不尽相同,但是大家都不知觉的精确到毫秒级,重要性可想而知。
  2. 提升web的SEO排名。在17年10月,百度就推出了对于首评加载时长超过3秒的web,降低其权重的“闪电算法”

三、web性能优化的原理

web性能的优化的原理,不得不提到浏览器在加载web首页时做的工作了,我们搞清楚了他的工作步骤,才能知道优化的点在哪里。下图是浏览器渲染的几个步骤:

上图中有几点需要我们注意一下:
3. DOM和CSS OM是有先后开始,但是在过程中是可以(注意是可以,不是一定,也不是不行)同步进行的
4. DOM和CSSOM 都和js的解析是互斥的,这个很好理解,js可以修改dom节点或者css样式,所以js会阻塞其他两个的进程,直至js执行完毕
那么他的执行顺序大致可以这么看

下面我们结合chorme的新增功能performance(控制台>performance)来对于每一个步骤的工作进行分析:

3.1 加载文档

常见的浏览器文档类型有,HTML、XHTML、SVG,XML,在用户打开浏览器的时候,首先要做的是解析域名和dns,找到对应的IP,然后通过校验之后,像服务器发起请求,服务器相应的内容就是要加载的文档。

3.2 生成dom树

这个过程主要是把文档解析成DOCUMENT OBJECT,例如html的<html> </html> <body></body>,这个结构的解析,浏览器内置的都可以直接解析这些文档,不用依赖任何其他的文件,所以这个过程会很快,最终生成表示能够表示整个文档和每个节点的类型,数据和节点关系的树形结构,简称dom树。

需要注意一点:这里是全部的node节点,即使<div style=“display:none”> 该节点会依然在dom树中存在

3.3 加载css 和js

这个之所以会算作一个过程,是因为随着web的发展,很多web越来越大,功能也越来越复杂,引入的css和js也越来越多,在整个页面中也慢慢的占据一定的位置。
5. 加载css包括 html中的css代码块,内联样式,和需要下载的外部样式
6. js 主要指下载外部引入的js文件

3.4 生成CSS OM

CSSOM是将对应的样式绑定到对应的节点上,为什么会有树的概念,个人理解,cssom tree有点像树上开的花,来表示节点的属性,而且树的根节点和子节点,也很好的表示了css的优先级,比如父布局的一些样式对于子样式的影响,但是在css om tree中并不是最终的样式。

  1. 是用户代理样式的重新计算
  2. 不包含所有的dom节点


3.5 rending tree

这个过程是DOM和CSS OM合并的过程,这个过程中主要做:

  1. 去除dom树中和页面渲染无关的节点,比如head 、mate等
  2. 计算和合并cssOm,并应用到dom树上
  3. 从dom树上去除display:none的节点,visiable:false的不会移除

这样就生成了rend tree。

3.6 layout(flow 、reflow)

这个过程成为layout或者flow,布局,主要是来计算每个node的尺寸,位置和颜色等信息,为了下一步的绘制作准备,因为这个过程并不是只执行一次,比如js解析的时候,调整某一个node节点的尺寸或者位置,就会导致重新计算,所以也可以成为reflow。
影响重新布局的原因如下:

  1. 节点的增改
  2. 节点样式的修改(不是全部,比如背景色就不会导致重新布局)
  3. 用户发起的事件,鼠标事件等等

3.7 paint(repaint)

绘制,原因和上方相同,都不止一次,会应为reflow,导致repaint。这里需要注意一点,paint的绘制是多线程分块进行的,可以在下图的三 看到,多个绘制并发进行。

3.8 composite (合并)

从3.7可以看到,分层绘制,带来了并行,提升了效率,但是最后需要将绘制的结果合并成一个页面,呈现给用户。

讲到这里渲染的原理基本差不多了,接下来,才进入正题,我想,你如果看到这里,应该也能想到很多可以优化的点了。

四、性能优化

我们的性能也是会结果上面的步骤,进行阐述,对应这个阶段的优化点哦。

4.1 html的语义化编程

语义化标签是浏览器内置就能解析识别的标签,最终的实现也会dom的结构简洁话,所以就会减少时间消耗哦

4.2 资源的加速
  1. 静态资源的cnd加速
  2. 图片资源的压缩
  3. 合并资源请求,虽然会增加单个请求的时间,但是发起请求,关闭请求的操作,很耗费资源。
  4. css资源的分片加载,最常见的就是
<link rel="stylesheet" type="text/css" media="print">

media属性可以接受一个或多个媒体值表,浏览器会根据当前的媒体值,来加载对应的样式表,这样就要比把所有的样式放在同一个样式文件中要来的好

  1. js的异步加载
    js文件的异步加载,一个页面的初始化中,因为很多时候外部的js文件相对大小还是不小的,如果这些文件不着急执行,可以添加这个属性,表示异步加载,不会阻塞其他的操作
<script type="text/javascript" src="" async>

async标签告诉浏览器,这个文件不着急加载,浏览器会在合适的时间来加载对应的文件

4.3 js的优化
  1. js代码尽量不要写在head中
  2. defer属性
 <script type="text/javascript" src="" defer>

这个属性告诉浏览器,这个文件不着急执行,和首页的渲染关系不大,可以等到页面加载和渲染完成之后再执行,比如对于node绑定事件等等

4.4 CSSOM 优化
  1. 内部样式尽量写在head中(或者说成写在文件尽可能的上方)因为是文档是子上而下的解析,如果写在下方,或者中间,遇到js会阻塞dom和cssom操作,所以避免这个情况,应该规范在head中
  2. 尽量少使用内联样式,原因如上
  3. 尽可能的不使用 @import 属性,import属性会在页面加载完成之后,或者使用到该css代码块的时候采取加载对应的文件,等效于把css写到的文档的底部,所以应该避免这种情况。
  4. less,secc的嵌套写法,这个写起来很爽,嗯,就是这样
4.5 dom操作节流
  1. 这个最常见,也是面试题中问的最多的,下面的demo比较极端
for (var i in 10) {arr[i].width  = document.getElementById("a").offsetTop
}//这样的话会导致页面每次都要去从新的绘制,拿到offsetTop,下面就会好很多
let top = document.getElementById("a").offsetTop
for (var i in 10) {arr[i].width  = top
}

2.不得不提到,前端框架,vue,虚拟节点,把dom操作缓存起来,定期的统一触发dom刷新,这个优势体现在,比如修改div的宽一次,高一次,用虚拟节点的形式,最终只会渲染重绘一次

4.6 加载渲染分流

可以参考淘宝首页,可以看到task分批加载,如果网速设置慢一点可以看到,从上而下的分段加载,让用户不至于看到全部白屏,能看到。

4.7 避免repaint和reflow

对于transform和opacity,会在单独的层级进行绘制,所以他们的改动不会触发回流,因此在一些可以使用

.element {will-change: transform;
}

来通知浏览器提升这个node的层级,在之后更新是会单独层绘制
讲到这,基本常用的介绍完啦

参考文档:
web性能详解-阮一峰
Web页面的性能优化
浏览器内核、JS 引擎、页面呈现原理及其优化

web常见性能优化总结(浏览器渲染过程详解)相关推荐

  1. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  2. 【前端性能优化】浏览器渲染原理与性能优化

    目录 1. 浏览器渲染基本步骤 2. 构建DOM树.CSSOM树 3. 构建渲染树 4. 计算渲染树的布局 5. 将布局渲染到屏幕上 6. 渲染优化 1. 浏览器渲染基本步骤 浏览器主要有以下步骤: ...

  3. 前端性能优化之浏览器渲染原理和关键渲染路径、复合线程、图层及优化、JS 开销及优化和 HTML 和 CSS 优化

    一.浏览器渲染原理和关键渲染路径 浏览器构建渲染树,DOM 树和 CSSDOM 树合成为 Render Tree 渲染树. 浏览器的渲染流程,如下所示: JavaScript -> Style ...

  4. HTML渲染过程详解

    由于本人对http协议以及dns对url的解析问题并不了解,所以这里之探讨url请求加载到浏览器端时,浏览器对html的解析到呈现过程,后来经过几位道友分享,整理了一下url解析的过程,如下: 用户输 ...

  5. web项目性能优化(整理)

    Web性能优化分为服务器端和浏览器端两个方面. 一.浏览器端,关于浏览器端优化,分很多个方面 1.压缩源码和图片 JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,J ...

  6. 如何从8 道面试题中,看出浏览器渲染过程与性能优化

    前言 移动互联网时代,用户对于网页的打开速度要求越来越高.百度用户体验部研究表明,页面放弃率和页面的打开时间关系如下图 所示. 根据百度用户体验部的研究结果来看,普通用户期望且能够接受的页面加载时间在 ...

  7. 列举6个常见且实用的Web前端性能优化方法

    在如今这个信息爆炸的时代,人们的节奏总是快速的,对于一个网站的耐心毕竟是有限的可怜的,如果网站不进行优化必定会流失相当一部分的客户,带来不必要的损失.那么从Web前端的性能优化上来说有哪些常见.实用的 ...

  8. WEB前端性能优化常见方法

    web前端是应用服务器处理之前的部分,前端主要包括:HTML,CSS,javascript,image等各种资源,针对不同的资源有不同的优化方式. 1. 内容优化 (1)减少HTTP请求数:这条策略是 ...

  9. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )

    文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...

最新文章

  1. python数据库学习--Mysql
  2. 使用国内源安装k8s
  3. Android 实现简单的插件化模块化
  4. opensuse 升级内核
  5. 卡扇区数据教程_硬盘有坏道了?如何对硬盘进行扇区级复制及数据恢复?
  6. QT的QCategoryAxis类的使用
  7. EJBCA 6 通过调用WebService接口增加用户并获取证书
  8. Dapr 正式发布 1.0
  9. Alpha 冲刺 (1/10)
  10. 21 Qt中ui设计中的一些小知识点
  11. 给定随机数列求第k大的数字
  12. Linux 磁盘与文件系统
  13. 计算机毕业设计django基于python药房药品管理系统(源码+系统+mysql数据库+Lw文档)
  14. tpac100控制器设置教程_tpac100控制器设置教程_TP-link AC控制器统一管理AP设置指导...
  15. portainer的安装使用
  16. 玩转AgileCDN(二)——运维小哥做报表,不再为时区换算而烦恼
  17. 最新!2016中国城市GDP排名出炉
  18. 阿里云服务器开发实践:使用云服务器ECS搭建DoH服务
  19. 电脑连接打印机并共享及其他打印机连接
  20. 树—— 二叉树的遍历

热门文章

  1. CVPR论文复现争议后续:华人一作苦战两月给出有态度的分析结果
  2. 钢条切割问题-动态规划-c语言实现
  3. 所见即所得的单目视频三维场景实时重建
  4. 顺丰api相关示例 - java版本(带打印)
  5. ingress controller安装总结
  6. 鸡兔同笼问题C++解决
  7. 在线音乐网站的设计和搭建
  8. 2020届秋招 网易互娱游戏研发工程师面经(已offer)
  9. 小陈学习JS if-else语句
  10. 工作效率全靠 Deadline?7 步策略让你成为行动派