浏览器渲染性能优化

2018-01-13  本文已影响10人  _于易

从用户输入浏览器输入url到页面最后呈现 有哪些过程?

答案大致如下:

  1. 用户输入URL地址
  2. 浏览器解析URL解析出主机名
  3. 浏览器将主机名转换成服务器ip地址(浏览器先查找本地DNS缓存列表 没有的话 再向浏览器默认的DNS服务器发送查询请求 同时缓存)
  4. 浏览器将端口号从URL中解析出来
  5. 浏览器建立一条与目标Web服务器的TCP连接(三次握手)
  6. 浏览器向服务器发送一条HTTP请求报文7.服务器向浏览器返回一条HTTP响应报文
  7. 关闭连接 浏览器解析文档
  8. 如果文档中有资源 重复6 7 8 动作 直至资源全部加载完毕

渲染页面的大致流程

  1. HTML解析出DOM Tree
  2. CSS解析出Style Rules
  3. 将二者关联生成Render Tree
  4. Layout 根据Render Tree计算每个节点的信息
  5. Painting 根据计算好的信息绘制整个页面

关于性能优化

这里还要说两个概念,一个是Reflow,另一个是Repaint。这两个不是一回事。
Repaint ——屏幕的一部分要重画,比如某个CSS的背景色变了。但是元素的几何尺寸没有变。
Reflow 元件的几何尺寸变了,我们需要重新验证并计算Render Tree。是Render Tree的一部分或全部发生了变化。这就是Reflow,或是Layout。(HTML使用的是flow based layout,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫reflow)reflow 会从<html>这个root frame开始递归往下,依次计算所有的结点几何尺寸和位置,在reflow过程中,可能会增加一些frame,比如一个文本字符串必需被包装起来。

Reflow的成本比Repaint的成本高得多的多。DOM Tree里的每个结点都会有reflow方法,一个结点的reflow很有可能导致子节点,甚至父点以及同级结点的reflow。在一些高性能的电脑上也许还没什么,但是如果reflow发生在手机上,那么这个过程是非常痛苦和耗电的。 所以,下面这些动作有很大可能会是成本比较高的。

注:display:none会触发reflow,而visibility:hidden只会触发repaint,因为没有发现位置变化。

基本上来说,reflow有如下的几个原因:

建议

综上所述给出性能优化的十点建议:

  1. HTML文档结构层次尽量少,最好不深于六层;
  2. 脚本尽量后放,放在前即可;
  3. 少量首屏样式内联放在标签内;
  4. 样式结构层次尽量简单;
  5. 在脚本中尽量减少DOM操作,尽量缓存访问DOM的样式信息,避免过度触发回流;
  6. 减少通过JavaScript代码修改元素样式,尽量使用修改class名方式操作样式或动画;
  7. 动画尽量使用在绝对定位或固定定位的元素上;
  8. 隐藏在屏幕外,或在页面滚动时,尽量停止动画;
  9. 尽量缓存DOM查找,查找器尽量简洁;
  10. 涉及多域名的网站,可以开启域名预解析
上一篇下一篇

猜你喜欢

热点阅读