WebKit的页面缓存 -- Page Cache

Page Cache概述


你可能更熟悉其它浏览器对Page Cache的叫法。Firefox称之为"Back-Forward Cache" 或 "bfcache"。Opera则叫做"Fast History Navigation"。我们最近开始把WebKit的实现叫做"Page Cache",以减少同"Back/Forward List"的混淆。
注意,Page Cache是一个终端用户功能,它使得网页浏览更顺畅。它不是HTTP规范中所说的"cache"。不是“disk cache”中的"cache"(原始资源被存储在本地磁盘上)。它也不是传统的"memory cache"所说的"cache"(Webkit把解码后的资源保存在内存中以在多个网页之间共享)。
那么…… 它到底是啥?
简单来讲,Page Cache是这样的,当你离开一个网页时,我们把它"暂停",当再访问它时我们点击"play"。
当一个用户点击一个链接区访问新的网页时,之前的网页会被完全丢掉。DOM被销毁,Javascript对象被当做垃圾回收,插件被销毁,解码的图片数据也被扔掉,还有其它各种各样的清理。
这样做之后,如果用户点击了后退按钮,就会有一个痛苦的体验。WebKit可能必须再次从网络上加载资源,重新解析主HTML文档,再次运行动态启动网页的脚本,重新解码图片数据,重新排版网页,回滚到正确的位置,重绘屏幕。所有这些工作都需要时间,CPU,和电池电源。
理想情况下,之前浏览的网页可以被放在Page Cache中。整个页面会被保存在内存中,即使它没有显示在屏幕上。这意味着没有显示在屏幕上的那些部分以及与它们的交互被挂起,而不是销毁。之后,一旦你点击了后退按钮,它们就可以快速呈现在你面前。

为什么它很重要


有了Page Cache,就可以为后退按钮提供即时体验。
进行搜索时,点击了一条搜索结果,之后点返回按钮,你期望可以立即看到与之前完全一样的搜索结果页面。你可能访问一个聚合网站,像Reddit或者Digg,你想要在同一个tab页签中快速看到不同的链接。你可能浏览器一个相册,并通过快速点击"back" 和 "forward"对两张图片进行对比。或者你可能只是误点了错误的链接,想要点击返回重新选择。
当你点击前进/后退按钮时,你可能不自觉的希望有Page Cache。如果使用了Page Cache, 用户会很开心,即便他们不知道后台是如何处理的。
相反的,如果没有使用Page Cache,用户常常同时咒骂浏览器和网页。

为什么不用呢?


既然Page Cache这么神奇,当你浏览一个新的网页时,为什么WebKit不总是用它呢?
下面是一些主要的原因。

有的网页没意思

首先,有的时候,缓存一个网页没什么意义,因为我们对于返回到与之前相同的状态并不感兴趣。例如,还没有加载完成的网页。或者加载出错的网页。或者一个被自动重定向的网页。

有的网页很复杂

其次,一个网页可能因为很难确定怎样"pause"它而不被Page Cache考虑。这种情况大多发生在那些做了很多事情的复杂网页上。
例如,包含本地代码的插件,它能够做任何它想做的事情,因此WebKit不能暂停它们。另一个例子是多frames的网页,WebKit历来不缓存。
令人苦恼的是,浏览这些更复杂的高级页面将可以从Page Cache获益更多的。

有的网页是需要安全验证的

HTTPs站点的服务器管理员常常很关心安全问题,对浏览器行为也很敏感。例如,金融机构会对每一个浏览器的行为都进行严格验证,之后才允许他们客户使用。
其中一个方面就是在于后退/前进行为。这些机构对于用户浏览时留在后台的数据类型是相当吹毛求疵的,这也可以理解。结果,我们没有走上极端小心谨慎的歧途,而是从一开始就选择不对所有的HTTPs站点进行缓存。
一个更细粒度的方法可能有助于改善用户体验,不过有很长的路要走。

改进计划

很明显有很多重要的场景我们还没有考虑到,因此还有很大的改善空间。
WebKit的Page Cache最初写于2002年,在第一个Safari浏览器测试版发布之前。它的能力反应的是当时的WebKit架构和2002年的网络环境。
如今的网络环境已经变化很大,我们也需要使Page Cache跟上变化。这项工作已经在开展了。
例如,revision 48036解决了一个主要的限制,现在多frames网页已经可以放入页面缓存了。使用最新的WebKit nightly好像“总感觉更快了”,这种快不好准确形容。有的人可能已经体验了这样的改进。
不过还有很多工作要做。
插件是我们名单上的下一个大头。正如之前提到,插件能够执行任何本地代码,所以我们不能可靠的点击到它们的“暂停”按钮。

WebKit早期的版本能够处理使用了某些类型插件的单frame网页。当离开网页时,WebKit会拆下插件,当用户返回时再恢复插件。不过为了使WebCore更快,更容易移植,这项能力消失了。
后来这项功能又恢复了- Bug #13634
至于HTTPs网页。现在我们完全禁止了。

WebKit的页面缓存 -- Page Cache,布布扣,bubuko.com

WebKit的页面缓存 -- Page Cache

上一篇:ASP.NET MVC4学习笔记路由系统实现


下一篇:win64+VS2010+OPENCV2.4.9配置问题