美文网首页
浏览器渲染性能优化

浏览器渲染性能优化

作者: _于易 | 来源:发表于2018-01-13 12:07 被阅读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发生在手机上,那么这个过程是非常痛苦和耗电的。 所以,下面这些动作有很大可能会是成本比较高的。

    • 当你增加、删除、修改DOM结点时,会导致Reflow或Repaint
    • 当你移动DOM的位置,或是搞个动画的时候。
    • 当你修改CSS样式的时候。
    • 当你Resize窗口的时候(移动端没有这个问题),或是滚动的时候。
    • 当你修改网页的默认字体时。

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

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

    • Initial。网页初始化的时候。
    • Incremental。一些Javascript在操作DOM Tree时。
    • Resize。其些元件的尺寸变了。
    • StyleChange。如果CSS的属性发生变化了。
    • Dirty。几个Incremental的reflow发生在同一个frame的子树上。

    建议

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

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

    相关文章

      网友评论

          本文标题:浏览器渲染性能优化

          本文链接:https://www.haomeiwen.com/subject/eslcoxtx.html