我想知道为什么 HTTP 服务器不将网页请求打包到单个文件中,然后由浏览器读取?
据我所知,每个网页的请求量(CSS/JSS/图像 + HTML 输出)加起来会使网页加载速度变慢,也会给网络服务器带来负担。是否有网络服务器可以打包所有内容(或尽可能多的内容)并将其发送到客户端?
为了说明我的问题:
正常情况 widgets.js widgets.css picture1.png picture2.png widgets.html
包装情况
小部件.pck
当然,一开始它会带来一些开销,但有了智能缓存,我认为应该可以实现一些改进?
答案1
如果某个特定页面上的所有对象都由同一台服务器提供,我想这是可能的。但在大多数情况下(尤其是拥有数百万用户的大型网站),情况并非如此。许多不同的服务器负责为每个页面的不同部分提供服务,如果您需要一个“前端”服务器来收集所有资源、打包并发送它们,那么性能将比现在浏览器负责获取所有页面资源的方式差得多。
答案2
这实际上是可能的:
- JS,只需将它们包含在服务器端即可。
- 可以嵌入对象(图像、flash 等)。请参阅:http://en.wikipedia.org/wiki/Data_URI_scheme和http://www.sweeting.org/mark/blog/2005/07/12/base64-encoded-images-embedded-in-html
拥有单独资源的优势在于,它们由从 Web 应用程序到 Web 浏览器的链条中的各个部分分别缓存: - 在网站上的文件系统级别缓存 - 静态文件(图像、JS 等)的单独站点 - 缓存和分发网络(如 Akamai) - 在 Web 浏览器上缓存。
因此,浏览器不会因为您添加了逗号而使整个页面的缓存无效,而只会重新加载 HTML 页面。
另外,请不要忘记,大多数网站和浏览器都使用启用了 KeepAlive 的 HTTP/1.1。这意味着来自同一网站的对象将在同一 TCP 连接上加载。
答案3
答案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 来查找一些内部诊断信息。