人都知道浏览器将这个新特性称为Page Cache。Firefox将其称为“Back-Forward Cache”或“bfcache.” ,Opera则称其为“Fast History Navigation.” ,在WebKit的实现中我们称其为“Page Cache”, 以避免与“Back/Forward List.”的混淆。
注意,页面缓存是使用用户更加流畅地浏览网页的一个客户端特性。而不是“HTTP”协议中的缓存,也不是将原始数据存在本地硬盘的“disk cache”。也不是通常意思上说的WebKit将解码后的资源保存在内存中供多个页面共享使用的“memory cache”。
那么,到底指什么呢?
简单地说,Page Cache的作用好比当你离开一个页面时让它“暂停”,当你返回时再“重新播放”。
当使用者点击一个链接跳至一个新页面时,先前的网页在内存中的所有资源都将释放。DOM也不将不存在,Javascript对象也由于垃圾回收不存在, 插件也被卸载,解码后的图片数据也完全丢弃,此外还有其它的清理工作。
但是当用户点击返回按钮退回原来页面时,这有点浪费。WebKit需要重新从网络下载资源,解析HTML文档, 运行页面上的脚本以创建动态的网页, 解码图片数据,排版,返回到原来的页面位置,宣染页面。这些工作都需要时间和CPU,以及电池的电量。
在理想情况下,跳转之前的网页应该保存在age Cache中,还“活着”的页面应该一直保存在内存中,尽管它现在没有呈现给用户。这意味着所有的呈现给你的数据以及和与交互有关的数据都应该保存而不是销毁。它们都能在你点击返回按钮之后恢复。
为什么页面缓存概述重要
页面缓存使得你点击返回按钮后的反映几乎是瞬时的。
当你进行搜索时,点击搜索按钮,然后再立即返回查看之前的搜索结果页面。你可能需要浏览一个收集了许多链接的页面。也可能浏览一个画廊页面时不停地点击"back"和"forward"。再或者一个简单的情况是你点击了一个错误的链接然后再返回。
在你点击返回和前进按钮的任何时候尽管你不知道页面缓存的存在,但是你肯定希望它起作用。当页面缓存被使能时,虽然用户不知道它的存在,但是它确实能提高用户的体验。
为什么页面缓存不总是使能
既然页面缓存这样令人惊奇,那为什么always并不总是使能它呢?
这有几个主要原因。
一些页面并不值得使用页面缓存
首先,一些情况下页面由于难以恢复其状态所以并不值得使用页面缓存。例如,页面加载并未完成。或者加载有错误。再或者页面仅是一个跳转页面,其作用仅是怎么跳转至另一个URL。
在这些情况下我们对WebKit中页面缓存的处理机制很满意。
一些页面太复杂不宜使用页面缓存
其次,页面可能由于太难以保存当前的状态而不使用页面缓存。
例如,插件中包含使得WebKit不能"点击暂停按钮"的本地程序。另一个例子是页面包含有多个WebKit没有缓存的frames。
遗憾的是浏览这些页面时使用页面缓存将比普通页面带来更大的性能提升。
一些页面是有安全性要求的
HTTPS网站的服务器管理员对浏览器的行为特别敏感和观注。例如,金融规则通常会非常严格地核实用户的浏览器的行为。
一些领域非常在意浏览器的返回/前进中的行为。这些规则可以理解地在对浏览器在用户浏览页面过程中可以保存哪些数据非常严格。因此宁可过份谨慎,WebKit禁止在访问HTTPS网站时使用页面缓存。
一些更加详细的工作会大大改善用户体验, 这需要很长的路走。
计划的改进
显然,一些情况我们没有进行处理,而且有很多的改进的地方。
WebKit的页面缓存代码在2002开始编写,在高速 Safari beta版本发布之前。其反映了当时WebKit的架构和Web的远景。
2009年的网络与当时有很大的不同,我们需要将页面缓存达到标准。幸运的是,这项工作正在很好的进行。
例如,版本revision 48036 中我们解决了不能对含有frame的网页使用页面缓存这个很大的限制。使用 latest WebKit nightly 会感觉速度快很多。
但是还有很多工作需要做。
插件是我们手头的重点之一。前面提到过由于插件可以运行本地代码所以我们不能可靠地点击“pause”按钮。
WebKit的早期版本处理包含一些类型插件的单frame页面。WebKit会在离开这些页面时关闭插件然后在恢复页面时重新加载插件。但是为使WebCore易于移植,丢弃了这部分功能 。
Bug #13634 重新使能了这一功能。
对于HTTPS页面来说,我们现在仍完全禁止其使用页面缓存,但是一些经过挑选的方法仍然能够在遵循安全规则的情况下提高用户检验。
Bug #26777 中除非在HTTPS的响应头部信息中有一些组织为使你的页面安全而使用的“cache-control: no-store”或者“cache-control: no-cache”。
如果你有其它改进的意建,可以在相应的bug文件中评论,或提交一个新bug文件。
卸载处理函数
还有一点我没有提到,那就是含有卸载事件处理函数的页面。
卸载事件是为使用户关闭页面时进行一些清理工作而设置的。
当页面不在浏览器页面缓存中时浏览器无法产生卸载事件,这是因为页面假设它处理一个最终的状态,而且可能会销毁其自身的关键部分。这与页面缓存的目的完全相反。
但是如果浏览器将页面缓存在页面缓存中但是没有产生卸载事件,那么页面在“暂停”时可能被销毁,清理工作尽管很重要可能高永远不会发生。
虽然卸载事件的目的是做一些“页面关闭时的重要工作”,但是所胡的主流浏览器并不将这类页面缓存在页面缓存中,这直接带来一些不好的用户体验。
在之后的文章中我将讲述更多的关于卸载事件处理函数,这对网页开发人员有很多工作需要做。敬请期待。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/su_yong/archive/2010/05/10/5576455.aspx