如果您使用 http2,Browserpaint 是否有任何变化?

Is there any change in the Browserpaint if you use http2?

我们正在考虑将拥有许多网站的服务器迁移到 http2。现在一个问题是,如果您使用 http2 并并行下载所有资源,那么浏览器开始绘制/渲染页面可能需要更长的时间,因为它正在等待下载所有资源,而不是仅仅从什么开始已经存在并在下载后继续重新绘制内容。

我认为这是错误的,但我没有找到任何文章或很好的解释,所以我可以向那些认为可能是这种情况的人证明这一点。

浏览器会在拥有绘制所需的资源时进行绘制,这在 HTTP/2 下基本不会改变。

我不确定为什么您认为浏览器会等待下载 HTTP/2 下的所有资源而不是 HTTP/1.1 下的所有资源?

某些资源(例如 CSS 和 Javascript,除非使用异步属性设置)是渲染阻塞,必须在初始绘制发生之前下载它们。理论上 HTTP/2 对于多个下载来说更快,所以如果你移动到 HTTP/2 应该发生的是这些将更快下载,所以它会更早绘制。

现在,浏览器在 HTTP/1.1 下使用的连接数有限(通常为 6-8)创建了一种自然排队机制,浏览器必须优先考虑这些关键资源而不是 non-critical 资源,例如图片并先发送。 HTTP/2 有更高的限制(通常为 100-120 次并行下载,具体取决于服务器),因此浏览器不再区分优先级,并且担心如果所有资源都并行下载,那么它们可能会减慢每个其他下来。例如,下载 50 张 print-quality 大图像会占用大量带宽,并且可能会导致同时下载更重要的 CSS 资源需要更长的下载时间。事实上 some early movers to HTTP/2 saw this scenario.

这已通过 HTTP/2 中的优先级和依赖关系解决 - 服务器可以发送某些资源类型(例如 CSS、JavaScript)比其他资源类型(例如图像)具有更高的优先级) 而不是发送具有相同优先级的所有内容。因此,即使所有 51 个资源同时运行,CSS 数据也应该先发送,然后是图像。客户端也可以建议优先级,但最终决定权在服务器。这确实取决于服务器实现是否具有良好的优先级策略,因此最好在切换之前进行测试。

另一件值得记住的事情是,如何衡量这一点在 HTTP/2 下发生了变化。如果低优先级图像在 HTTP/1 下排队等待 4 秒,等待有限数量的 HTTP/1 连接之一变为空闲,然后在 2 秒内下载,您之前可能将其测量为 2 秒下载时间(这在技术上是不正确的,因为您没有包括排队时间,所以实际上是 6 秒)。因此,如果这显示为 HTTP/2 下的 5 秒,因为它是立即发送的,您可能认为它慢了 3 秒,而实际上它快了整整一秒。在分析任何移动到 HTTP/2 的影响时需要注意的事情。因此,在衡量影响时,最好查看总体关键指标(首次绘制、文档完成...等)而不是单个请求。

顺便说一下,这是一个非常有趣的话题,它超出了 Whosebug 答案中可以合理预期涵盖的范围。这是一个无耻的插件,但如果有兴趣了解更多信息,我会介绍很多 in a book I am writing on the topic

如果网络服务器遵守浏览器请求的优先级,理想情况下您提到的情况不会发生。在 http2 上,浏览器通常请求 css 具有最高优先级和异步 js,具有较低优先级的图像。这应该确保即使同时请求您的图像、js 和 css - 服务器首先发送回 css。

唯一不应该发生的情况是浏览器配置不正确。

您可以在 chrome devtools 中查看任何页面的各种资源的优先级。