优化文件缓存和 HTTP2

Optimizing File Cacheing and HTTP2

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

我的理解是 http2 使文件连接等优化技术过时,因为使用 http2 的服务器只发送一个请求。

相反,我看到的建议是最好保持文件大小较小,这样它们更有可能被浏览器缓存。

这可能取决于网站的大小,但是如果网站使用 http2 并且想专注于缓存,那么网站的文件应该多小?

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

所以我有两个问题:

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

如果它们小到可以被缓存,对于使用不支持 http2 的浏览器的用户来说,无论如何连接文件是否很好。

在这种情况下使用更大的文件大小并使用 HTTP2 会不会有什么坏处?这样一来,用户 运行 这两种协议都会受益,因为网站可以同时针对 http 和 http2 进行优化。

让我们澄清一些事情:

My understanding is that http2 renders optimization techniques like file concatenation obsolete, since a server using http2 just sends one request.

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

然而,有一个相反的论点,即多个文件仍然存在开销,包括请求它们、缓存它们、从缓存中读取它们......等等。它在 HTTP/2 中大大减少但没有完全消失。此外,gzip 文本文件在大文件上比单独 gzip 大量小文件效果更好。然而,就我个人而言,我认为不利因素超过了这些担忧,而且我认为一旦 HTTP/2 无处不在,连接就会消失。

Instead, the advice I am seeing is that it's better to keep file sizes smaller so that they are more likely to be cached by a browser.

It probably depends on the size of a website, but how small should a website's files be if its using http2 and wants to focus on caching?

文件大小与是否缓存无关(除非我们谈论的是比缓存本身大的真正大文件)。将文件拆分为更小的块更利于缓存的原因是,如果您进行任何更改,则仍可以使用缓存中未触及的任何文件。如果您将所有 javascript(例如)放在一个大的 .js 文件中,并且您更改了一行代码,则需要再次下载整个文件 - 即使它已经在缓存中。

同样,如果您有图像精灵图,那么这对于减少 HTTP/1.1 中的单独图像下载非常有用,但如果您需要编辑它以添加一个额外的图像,则需要重新下载整个精灵文件图像例如。更不用说下载了 whole 东西 - 即使对于只使用其中一个图像精灵的页面也是如此。

然而,综上所述,有一种思路认为长期缓存的好处被夸大了。请参阅 this article,特别是关于 HTTP 缓存的部分,它表明大多数人的浏览器缓存比您想象的要小,因此您的资源不太可能缓存很长时间。这并不是说缓存不重要 - 但更多的是它对于在该会话中浏览而不是长期浏览很有用。因此,每次访问您的网站都可能会再次下载您的所有文件 - 除非他们是非常频繁的访问者,拥有非常大的缓存,或者不常上网。

is it good to concatenate files anyways for users who use browsers that don't support http2.

可能吧。但是,除了 Android、HTTP/2 browser support is actually very good,所以您的大多数访问者可能已经 HTTP/2 启用。

也就是说,在 HTTP/2 下连接 HTTP/1.1 下不存在的文件没有额外的缺点。好的,可以争论说可以通过 HTTP/2 并行下载许多小文件,而需要作为一个请求下载更大的文件,但我不认为这会减慢速度。没有这方面的证据,但直觉表明数据仍然需要发送,所以无论哪种方式你都有带宽问题,或者你没有。此外,请求许多资源的开销仍然存在,尽管在 HTTP/2 中已大大减少。对于大多数用户和网站来说,延迟仍然是最大的问题——而不是带宽。除非你的资源真的很大,否则我怀疑你会注意到我下载 1 个大资源与在 HTTP/2 中并行下载相同数据分成 10 个小文件之间的区别(尽管你会在 HTTP/1.1).更不用说上面讨论的 gzipping 问题了。

所以,在我看来,继续连接一段时间没有坏处。在某些时候,您需要根据您的用户资料判断缺点是否大于好处。

Would it hurt to have larger file sizes in this case AND use HTTP2? This way, it would benefit users running either protocol because a site could be optimized for both http and 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 下的延迟问题和连接限制的影响要大得多,而不是带宽问题。