一次完整的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

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


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

查看所有标签

猜你喜欢:

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

Practical JavaScript, DOM Scripting and Ajax Projects

Practical JavaScript, DOM Scripting and Ajax Projects

Frank Zammetti / Apress / April 16, 2007 / $44.99

http://www.amazon.com/exec/obidos/tg/detail/-/1590598164/ Book Description Practical JavaScript, DOM, and Ajax Projects is ideal for web developers already experienced in JavaScript who want to ......一起来看看 《Practical JavaScript, DOM Scripting and Ajax Projects》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

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

在线 XML 格式化压缩工具