performance - 优化文件缓存和HTTP2

标签 performance browser-cache pagespeed http2

我们的网站正在考虑切换到http2。

我的理解是,由于使用http2的服务器仅发送一个请求,因此http2使诸如文件串联之类的优化技术过时了。

取而代之的是,我看到的建议是,最好使文件的大小保持较小,以便更有可能被浏览器缓存。

它可能取决于网站的大小,但是如果网站使用http2并希望专注于缓存,则网站的文件应该多小?

在我们的例子中,我们的许多单独的js和css文件都在1kb至180kb的范围内。 jQuery和bootstrap可能更多。累积地,我们网站上的页面的全新下载通常少于900 kb。

所以我有两个问题:

这些文件大小是否足够小,可以被浏览器缓存?

如果它们足够小以至于可以缓存,那么对于使用不支持http2的浏览器的用户而言,将文件串联起来还是一件好事。

在这种情况下,使用更大的文件大小并使用HTTP2是否会有害?这样,因为可以针对http和http2都对站点进行优化,这将使运行两种协议的用户受益。

最佳答案

让我们澄清一些事情:


我的理解是,由于使用http2的服务器仅发送一个请求,因此http2使诸如文件串联之类的优化技术过时了。


HTTP / 2使得诸如文件串联之类的优化技术有些过时,因为HTTP / 2允许许多文件通过同一连接并行下载。以前,在HTTP / 1.1中,浏览器可以请求一个文件,然后必须等待该文件完全下载后才能请求下一个文件。这导致诸如文件串联(以减少所需的文件数量)和多个连接(允许并行下载的黑客)之类的变通办法。

但是,有一个反论点,即多个文件仍然有开销,包括请求它们,对其进行缓存,从缓存中读取它们……等等。在HTTP / 2中已大大减少,但并未完全消除。另外,与单独压缩许多较小的文件相比,gzip压缩文本文件在较大的文件上效果更好。但就我个人而言,我认为不利因素超过了这些担忧,并且我认为,一旦HTTP / 2普及了,连接将消失。


取而代之的是,我看到的建议是,最好使文件的大小保持较小,以便更有可能被浏览器缓存。

它可能取决于网站的大小,但是如果网站使用http2并希望专注于缓存,则网站的文件应该多小?


文件的大小与是否要缓存无关(除非我们谈论的是比缓存本身大的真正大文件)。将文件分割成较小的块更适合缓存的原因是,这样,如果您进行了任何更改,那么仍可以从缓存中使用任何未触及的文件。如果将所有JavaScript(例如)保存在一个大的.js文件中,并且更改了一行代码,则需要重新下载整个文件-即使该文件已经在缓存中了。

同样,如果您有图像精灵图,那么这对于减少HTTP / 1.1中单独的图像下载非常有用,但是例如,如果您需要对其进行编辑以添加一个额外的图像,则需要重新下载整个精灵文件。更不用说整个过程都已下载-甚至对于仅使用这些图像精灵之一的页面也是如此。

但是,说了这么多,有种思路表明长期缓存的好处已被夸大了。请参见this article,尤其是有关HTTP缓存的部分,该部分显示大多数人的浏览器缓存比您想象的要小,因此不太可能将您的资源缓存很长时间。这并不是说缓存并不重要-而是它对在该会话中浏览而不是长期浏览很有用。因此,每次访问您的网站都可能会再次下载您的所有文件-除非它们是非常频繁的访问者,具有很大的缓存或不会在网上冲浪太多。


对于使用不支持http2的浏览器的用户而言,将文件串联起来是否很好?


可能吧但是,除了在Android上以外,HTTP/2 browser support is actually very good因此大多数访问者可能已启用HTTP / 2。

如此说来,串联HTTP / 2下的文件(在HTTP / 1.1下尚不存在)没有更多的缺点。可以争论的是,可以通过HTTP / 2并行下载许多小文件,而作为一个请求需要下载一个大文件,但是我不认为这样做会降低下载速度。对此没有任何证据,但直觉表明仍需要发送数据,因此无论哪种方式都存在带宽问题。另外,尽管仍然减少了HTTP / 2的请求,但仍然需要大量资源,因此开销仍然很大。对于大多数用户和站点而言,延迟仍然是最大的问题,而不是带宽。除非您的资源确实是巨大的,否则我怀疑您会注意到我已经下载了1个大资源,还是将相同的数据拆分为10个以HTTP / 2并行下载的小文件之间的区别(尽管在HTTP / 1.1中会如此) 。更不用说上面讨论的gziping问题。

因此,我认为继续连接一会儿没有什么害处。在某些时候,您需要确定缺点是否超过了给您用户配置文件带来的好处。


在这种情况下,使用更大的文件大小并使用HTTP2是否会有害?这样,因为可以针对http和http2都对站点进行优化,这将使运行两种协议的用户受益。


绝对不会受伤。如上文所述,(基本上)在HTTP / 2下连接文件并没有额外的缺点,而在HTTP / 1.1下还没有。在HTTP / 2下,它不再是必需的,并且具有缺点(可能减少缓存的使用,需要构建步骤,由于部署的代码与源代码不同,因此使调试变得更加困难等)。

使用HTTP / 2,您将仍然能看到任何网站的巨大收益-除了最简单的网站之外,最简单的网站可能看不到任何改善,也不会带来负面影响。而且,由于较旧的浏览器可以坚持使用HTTP / 1.1,因此它们没有任何缺点。当您决定停止实施HTTP / 1.1性能调整时(例如,串联)是一个单独的决定。

实际上,不使用HTTP / 2的唯一原因是实现仍然处于最前沿,因此您可能还不满意在其上运行生产网站。

****编辑2016年8月****

This post从一个带宽受限的图像站点最近开始对HTTP / 2社区引起了一定的兴趣,这是第一个记录的示例,其中HTTP / 2实际上比HTTP / 1.1慢。这突显了一个事实,即HTTP / 2技术和理解仍然是新的,并且需要对某些站点进行一些调整。似乎没有免费的午餐!值得一读,尽管要牢记这是一个极端的例子,并且在性能方面,大多数站点受HTTP / 1.1下的延迟问题和连接限制而不是带宽问题的影响更大。

关于performance - 优化文件缓存和HTTP2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588692/

相关文章:

http - 在HTTP中使用Etag有什么好处吗?

caching - 如何为 blogspot 站点的 CSS、JS 和图像设置过期 header

Java GC高,如何找出哪些对象被GC了

performance - Hadoop中的UDF优化

caching - 浏览器如何比较 URL 进行缓存?

PageSpeed Insights API 限制

javascript - 如何预加载字体?

java - A* 寻路算法运行速度极慢

javascript - 函数包装器在类上的性能基准测试与仅构造函数调用调用和 HaveSameMap 的对比

angularjs - angularjs 中是否默认启用缓存?