为什么 HTTP 服务器在可能的情况下不发回单个文件?

为什么 HTTP 服务器在可能的情况下不发回单个文件?

我想知道为什么 HTTP 服务器不将网页请求打包到单个文件中,然后由浏览器读取?

据我所知,每个网页的请求量(CSS/JSS/图像 + HTML 输出)加起来会使网页加载速度变慢,也会给网络服务器带来负担。是否有网络服务器可以打包所有内容(或尽可能多的内容)并将其发送到客户端?

为了说明我的问题:

正常情况 widgets.js widgets.css picture1.png picture2.png widgets.html

包装情况

小部件.pck

当然,一开始它会带来一些开销,但有了智能缓存,我认为应该可以实现一些改进?

答案1

如果某个特定页面上的所有对象都由同一台服务器提供,我想这是可能的。但在大多数情况下(尤其是拥有数百万用户的大型网站),情况并非如此。许多不同的服务器负责为每个页面的不同部分提供服务,如果您需要一个“前端”服务器来收集所有资源、打包并发送它们,那么性能将比现在浏览器负责获取所有页面资源的方式差得多。

答案2

这实际上是可能的:

拥有单独资源的优势在于,它们由从 Web 应用程序到 Web 浏览器的链条中的各个部分分别缓存: - 在网站上的文件系统级别缓存 - 静态文件(图像、JS 等)的单独站点 - 缓存和分发网络(如 Akamai) - 在 Web 浏览器上缓存。

因此,浏览器不会因为您添加了逗号而使整个页面的缓存无效,而只会重新加载 HTML 页面。

另外,请不要忘记,大多数网站和浏览器都使用启用了 KeepAlive 的 HTTP/1.1。这意味着来自同一网站的对象将在同一 TCP 连接上加载。

答案3

减少请求数量的标准技术是:

  • 将所有 JS 代码放在一个文件中(并最小化它);
  • 将所有 CSS 代码放在一个文件中(并最小化它);
  • 将所有可重复使用的小图像放入一个精灵中;

但是,将所有这些都内嵌在 HTML 中是不切实际的。JS/CSS/sprites 可在整个网站中重复使用,当您请求另一个页面时,它们将保留在浏览器的缓存中。

顺便说一句。我推荐你一本关于这个主题的书:

答案4

正如其他人提到的,当前的 HTTP 协议对此提供的支持有限。

有一种 DATA URI 方案,它允许您将二进制对象(如图像)编码为 base64 并内联它们,从而有效地将 HTML 和对象合并到一个文件中。这会降低缓存能力,但对于小对象来说仍然是值得的,因为它可以减少短期连接的数量并减少未压缩标头的传输。Google 的 mod_pagespeed Apache 扩展会自动为 2k 及以下的对象执行此技巧以及其他技巧。请参阅http://code.google.com/intl/nl/speed/page-speed/docs/filter-image-optimize.html

HTTP 流水线/keepalive 很有用,但正如 Koos van den Hout 提到的那样,它们只适用于已知大小的对象。此外,流水线和 gzip 压缩对未压缩的 header 和 cookies 传输没有任何作用。

一个有趣的发展是谷歌研究项目SPDY,它几乎可以实现您所建议的功能。除此之外,它还会通过单个 TCP 连接交错多个 HTTP 请求,交错并优先处理资源。它还会压缩整个流,包括标头和 cookie。测试显示页面加载时间减少了约 50%,因此我一定会关注这个项目。

Google 的 Chrome 浏览器在与 Gmail 和 Search 等 Google 网站通信时已使用 SPDY 协议。您可以在位置栏中输入 about:net-internals 来查找一些内部诊断信息。

相关内容