用最简洁的话总结浏览器运行机制

453 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

渲染过程:

  1. 输入url,浏览器根据 DNS 服务器得到域名的 IP 地址
  2. 向服务器请求,服务器返回请求,客户端得到返回的内容
  3. 自上而下生成dom树
  4. 渲染css树,生成cssom
  5. 渲染layout,计算节点大小,位置
  6. 根据以上进行页面渲染

思考

渲染过程中,如果遇到<script>就停止渲染,执行 JS 代码,这个时候解析器是暂停状态,等 JS 加载完毕后,再进行构建

所以,建议将 script 标签放在 body 标签底部的原因就是这样

结构

dom tree的根是document,左枝右杆是head和body,以下都是树叶子节点

3741810759-5d24133bcda5a_fix732.png

回流/重排:

当渲染树中的一部分或者全部因为布局等问题需要重新构建,就会进行回流/重排,每个页面必定会有一次,就是第一次加载的时候

重绘: 当渲染树中的一部分因为样式等问题需要重新构建,就会进行重绘

重排一定会重绘,但重绘不一定重排

重排重绘会造成浏览器耗时,卡顿等问题,所以不能频繁重复改变dom

根据以上问题优化

  1. 直接改变classname
  2. 如果要创建多个dom,就一次性加进去
  3. 需要多次重排的元素,设置绝对定位脱离文档流,就不会对其他元素造成影响了
  4. 避免使用 CSS 表达式
  5. 避免使用 table 布局

所以有了虚拟dom来优化这一点

虚拟dom是用js模拟出来的树,当构建完后一次性的渲染到文档流里

更新时利用diff算法进行更新,diff算法涉及一个key,用来保证能精确的找到节点位置进行更改,不然会造成后续节点的重复构造,消耗不必要的性能