一次完整的web请求和渲染过程以及如何优化网页

栏目: CSS · 发布时间: 5年前

内容简介:本文主要介绍访问一个网站时的流程,页面渲染过程,包括其中涉及到的概念。 以及,我们如何去优化前端页面,让它访问速度更快。(critical rendering path最佳渲染路径)在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接。 这是 HTTP/1.x 交付模型的直接结果,该模型可以保证每个连接每次只交付一个响应(响应排队)。 更糟糕的是,这种模型也会导致队首阻塞,从而造成底层 TCP 连接的效率低下。 也就是说在目前的HTTP1.X的协议下,浏览器对资源

本文主要介绍访问一个网站时的流程,页面渲染过程,包括其中涉及到的概念。 以及,我们如何去优化前端页面,让它访问速度更快。(critical rendering path最佳渲染路径)

  1. 打开浏览器,输入URL
  2. DNS解析
  3. 完成TCP握手
  4. 发送HTTP请求
  5. 接收HTTP响应结果
  6. 浏览器解析HTML,CSS
  7. 构建对象模型,DOM tree 和 CSSOM tree,组成render tree
  8. 浏览器渲染页面(布局)
一次完整的web请求和渲染过程以及如何优化网页

HTTP1.x和HTTP2

在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接。 这是 HTTP/1.x 交付模型的直接结果,该模型可以保证每个连接每次只交付一个响应(响应排队)。 更糟糕的是,这种模型也会导致队首阻塞,从而造成底层 TCP 连接的效率低下。 也就是说在目前的HTTP1.X的协议下,浏览器对资源的并发请求个数是有限制的。 等到HTTP2到来的时候,通过二进制分帧层进行优化。 HTTP/2 中新的二进制分帧层突破了这些限制,实现了完整的请求和响应复用:客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。

优势:

  • 并行交错地发送多个请求,请求之间互不影响。
  • 并行交错地发送多个响应,响应之间互不干扰。
  • 使用一个连接并行发送多个请求和响应。

但这些并不是我们能够优化的部分。

基于现在的网络条件,我们可以采用多个CDN地址,进行不同源的并发改善优化。 这篇文章主要介绍,第六步开始我们可以优化的部分,也就是解析HTML,CSS。

浏览器是如何构建对象模型的?

  • 字节 → 字符 → 令牌 → 节点 → 对象模型。
  • HTML标记与CSS标记都会经历上述过程,HTML变为DOM,CSS变为CSSOM
    一次完整的web请求和渲染过程以及如何优化网页

render tree构建,布局以及绘制

构建好 render tree 之后,会过滤掉 display:none 这种无需渲染的节点。将 tree 渲染到页面。

值得注意的是,每一次的dom或者造成布局影响的变动,都会触发 reflow(回流/重排) ,会消耗很大的页面资源。

reflow 是由于dom或者布局的变动而触发,如修改了dom位置,或是宽高,margin, padding等。 repaint 是样式风格修改,不影响布局时触发,如改了颜色之类的

提高网页渲染速度,主要可以减少 DOM , CSSOM 处理, 合并 render tree ,以及 减少 reflow 的次数

前端页面优化,减少reflow的方法 这里可以看看如何减少reflow的次数

对CSS的优化

根据上面的内容我们知道了,想要渲染页面必须有 render tree ,而 render tree 是由 DOM tree 以及 CSSOM tree 组成的。

@media

所以,为了让页面更快的渲染,*我们必须要尽早的将CSS资源下载到我们的客户端。*以及使用 @media 进行优化

为了获得最佳性能,你可以使用一些inline css,这样不会去CDN获取资源,从而造成 多次往返

对JS的优化

当 HTML 解析器遇到一个 script 标记时,它会暂停构建 DOM,将控制权移交给 JavaScript 引擎;等 JavaScript 引擎运行完毕,浏览器会从中断的地方恢复 DOM 构建。

这也就是为什么我们需要将 script tag放在页面的底部。 /React APP一般会如此使用。因为React需要将整个APP 渲染到一个DOM节点上,如果放置在DOM之上,会造成React找不到该渲染的节点,从而报错/

而我们一般不建议在 render tree 刚刚建立的时候,就使用JS去操作DOM,从而造成reflow,也就是说,希望JS不要成为 render tree 的一部分。这个时候,我们将 <script> 放在页面靠下的部分就可以不阻塞页面的渲染。

如果你的 <script> 是从CDN获取资源,那么等待的过程也会造成一定的阻塞。

你可以将 <script> 加上 async ,让它变为异步加载。

为了实现最佳性能,建议去除 关键渲染路径 中任何不必要的JavaScript

/ 关键渲染路径 是指优先显示与当前用户操作有关的内容。/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浅薄

浅薄

[美] 尼古拉斯·卡尔 / 刘纯毅 / 中信出版社 / 2010-12 / 42.00元

《浅薄:互联网如何毒化了我们的大脑》在我们跟计算机越来越密不可分的过程中,我们越来越多的人生体验通过电脑屏幕上闪烁摇曳、虚无缥缈的符号完成,最大的危险就是我们即将开始丧失我们的人性,牺牲人之所以区别于机器的本质属性。——尼古拉斯•卡尔“谷歌在把我们变傻吗?”当尼古拉斯•卡尔在发表于《大西洋月刊》上赫赫有名的那篇封面文章中提出这个问题的时候,他就开启了人们热切渴望的期盼源泉,让人急于弄清楚互联网是在......一起来看看 《浅薄》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具