Page 192 - Web性能权威指南
P. 192
优化 Gmail 性能
Gmail 使用了大量 JavaScript,而且也不断拓展了现代浏览器的性能边界。要提升
首次加载性能,Gmail 团队尝试了各种技术,目前包括如下这些:
• 把首次绘制所需的 CSS 单独拿出来,优先于其他 CSS 文件发送;
• 递增地交付较小的 JavaScript 块,以实现递增式执行;
• 使用定制的外部更新机制,即客户端在后台下载新的 JavaScript 文件,然后
在页面刷新时更新。
鉴于 Gmail 如此庞大的用户数量,如果所有打开的浏览器都要更新脚本,那哪怕
一次简单的 JavaScript 更新,都可能演变为一次自残式的 DoS 攻击。为此,Gmail
会在用户使用旧版本页面时,在后台预先加载更新文件,这样既可以分散负荷,
又能提升下一次刷新时的速度。这个过程每天都重复不止一次。
在此基础上,为了让用户感觉第一次加载的速度很快,Gmail 团队还在 HTML 文档
中嵌入了关键性 CSS 和 JavaScript,然后以块的形式递增加载其余 JavaScript 文件,
以加快脚本执行——第一次打开 Gmail 时显示的进度条,反映的就是这个过程!
11.7 嵌入资源
嵌入资源是另一种非常流行的优化方法,把资源嵌入文档可以减少请求的次
数。比如,JavaScript 和 CSS 代码,通过适当的 script 和 style 块可以直接放在
页面中,而图片甚至音频或 PDF 文件,都可以通过数据 URI(data:[mediatype]
[;base64],data)的方式嵌入到页面中:
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAA
AAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw=="
alt="1x1 transparent (GIF) pixel" />
前面的例子是在文档中嵌入了一个 1×1 的透明 GIF 像素。而任何 MIME
类型,只要浏览器能理解,都可以通过类似方式嵌入到页面中,包括
PDF、音频、视频。不过,有些浏览器会限制数据 URI 的大小,比如 IE8
最大只允许 32 KB。
数据 URI 适合特别小的,理想情况下,最好是只用一次的资源。以嵌入方式放到页
面中的资源,应该算是页面的一部分,不能被浏览器、CDN 或其他缓存代理作为单
独的资源缓存。换句话说,如果在多个页面中都嵌入同样的资源,那么这个资源将
会随着每个页面的加载而被加载,从而增大每个页面的总体大小。另外,如果嵌入
HTTP 1.x | 177