为什么HTTP服务器在可能的时候不能发送单个文件?

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

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

所以说明我的问题:

一般情况下widgets.js widgets.css picture1.png picture2.png widgets.html

包装情况

widgets.pck

当然,它会给一点点开销,但有了智能caching,我会说一些改进应该是可能的?

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

这实际上是可能的:

具有独立资源的优点是,它们被链式Web应用程序的各个部分分别caching到Web浏览器中: – 在网站上的文件系统级caching – 用于静态文件(图像,JS等)的独立站点 – caching和分销networking(如Akamai) – 在Web浏览器上caching。

因此,而不是使整个页面的caching无效,因为您已经添加了一个逗号,浏览器将只重新加载HTML页面。

另外不要忘记,大部分的网站和浏览器都使用KeepAlive的HTTP / 1.1。 这意味着来自同一网站的对象将被加载到相同的TCP连接上。

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

  • 把所有的JS代码放在一个文件(并尽量减less);
  • 把所有的CSS代码放在一个文件(并尽量减less);
  • 把所有小的,可重用的图像放入一个精灵;

但是,把所有内容都放在HTML中是不切实际的。 JS / CSS / sprites在整个站点都是可重用的,当你请求另一个页面时,它们将停留在浏览器的caching中。

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

Web服务器的答案不会被压缩到一个存档中,但有两件事情会发生

  1. http keepalives允许多个对象通过一个http连接(Apacheconfiguration条件中的KeepAlive)来服务。 这只适用于具有已知大小的对象(所以服务器可以告诉客户端当前对象的末尾,这排除了dynamic对象)。
  2. 在服务器和客户端之间协商的响应压缩(Apache模块mod_deflate)

我认为这两者在你的build议上是一样的,但都是基于客户和服务器之间关于能力和愿望的谈判。

正如其他人所说,目前的HTTP协议为此提供了有限的支持。

有数据URI的scheme,允许你像图像二进制对象编码到base64和内联,有效地结合HTML和对象到一个文件。 这减less了caching能力,但是通过减less短暂连接的数量和减less未压缩标题的传输,小型对象仍然是值得的。 Google的mod_pagespeed Apache扩展执行这个技巧,除其他外,自动为2k或更less的对象。 请参阅http://code.google.com/intl/nl/speed/page-speed/docs/filter-image-optimize.html

HTTPstream水线/保持活动很有用,但正如Koos van den Hout所提到的,只能处理已知大小的对象。 此外,pipe道传输和gzip压缩对标头和cookie的未压缩传输没有任何作用。

Google的一个名为SPDY的研究项目是一个有趣的发展,它几乎完成了您的build议。 其中,它通过单个TCP连接交错多个HTTP请求,交错和优先化资源。 它也压缩整个stream,包括标题和cookie。 testing显示,网页加载时间减less了大约50%,所以我一定要留意这个项目。

Google的Chrome浏览器在与Gmail和Google等网站进行通信时,已经使用SPDY协议。 您可以通过在地址栏中inputabout:net-internals来find一些内部诊断。