网页请求_04_浏览器接收数据并渲染页面

75 阅读3分钟

注意:1.内容来自网络,可随意转载修改;2. 该内容为前端开发领域

浏览器加载过程

  • 当浏览器获得一个html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。
  • 加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。
  • 遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。
  • 当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。

浏览器加载外联js和css的阻塞情况(JS 全阻塞,CSS 半阻塞)

  • JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。
  • CSS不阻塞DOM的加载和解析(它只阻塞DOM的渲染呈现。这里谈加载),不会阻塞其它资源(如图片)的加载,但是会阻塞 后续JS 文件的执行(原因之一是,js执行代码可能会依赖到css样式。css只阻塞执行而不阻塞js的加载)。
  • 鉴于上面的特性,当css后面存在js的时候,css会间接地阻塞js后面资源的加载(css阻塞js,js阻塞其他资源 )。
  • 现代浏览器会进行 prefetch 优化,浏览器在获得 html 文档之后会对页面上引用的资源进行提前下载

  浏览器渲染

  • 浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树)
  • 布局阶段——在屏幕上绘制渲染树中的所有节点的几何属性,比如: 位置,宽高,大小等等,这个过程称为 Flow 或 Layout 。
  • 绘制元素——绘制所有节点的可视属性。
  • 合并渲染层——把以上绘制的所有图层(类似于PhotoShop中的“图层”)合并,最终输出一张图片【其中的阶段3、4可称之为Paint】

  Repaint和Reflow

  • 当用户在浏览网页时进行交互或通过 js 脚本改变页面结构时,以上的部分操作有可能重复运行,此过程称为 Repaint 或 Reflow。
  • Repaint:当元素改变的时候,将不会影响元素在页面当中的位置(比如 background-color, border-color, visibility),浏览器仅仅会应用新的样式重绘此元素,此过程称为 Repaint。
  • Reflow:当元素改变的时候,将会影响文档内容或结构,或元素位置,此过程称为 Reflow。( HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow。) -Reflow 的成本比 Repaint 的成本高得多的多。我们应当尽量避免Reflow。

 

如何优化浏览器渲染过程

  • 创建有效的 HTML 和 CSS ,不要忘记指定文档编码,比如。
  • CSS 样式应该包含在 中, Javascript 脚本出现在末尾。
  • 减少 CSS 嵌套层级和选择适当的选择器,可参考 如何提升 CSS 选择器性能。
  • 不要通过 JS 逐条修改 DOM 的样式,提前定义好 CSS 的 Class 进行操作。
  • 尽量减少将 DOM 节点属性值放在循环当中,会导致大量读写此属性值。
  • 尽可能的为产生动画的 HTML 元素使用 fixed 或 absolute 的 position ,那么修改他们的 CSS 是不会 Reflow 的。

  图片2.png

图片1.png

参考: www.zhihu.com/question/26…

参考:juejin.cn/post/684490…

参考:zhuanlan.zhihu.com/p/80551769