然而,web 应用程序就没这些优点了。于是在 web 早期我们就发明了 cookie,目的是在本地持久存储少量数据。但是,cookie 有三个致命缺点:
?cookie 会包含进每一个 HTTP 请求,因此会减慢 web 应用程序,产生不必要的重复数据;
?cookie 会包含进每一个 HTTP 请求,因此网络上发送的数据就不能加密(除非你的整个应用都是用的 SSL)
?cookie 限制数据大小为 4 KB——这已经足以降低你的应用程序的速度,但是 4 KB 的大小有时候确实会捉襟见肘。
我们真正想要的是:
?更大的存储空间
?在客户端上的
?不受页面刷新的影响
?不需要提交到服务器
在 HTML5 之前,我们没有任何办法能够同时满足以上要求。
HTML5 之前的解决方案
一开始,我们的浏览器只有 Internet Explorer。或者说,那是 Microsoft 所期望的世界。到后来,在第一次浏览器大战期间,Microsoft 发明了一大堆东西,全部包含进了 Internet Explorer,而这个浏览器赢得了第一次浏览器大战。这其中之一就是 DHTML 行为(DHTML Behaviors),其中有一个行为叫做“用户数据 userData”。
userData 允许每一个域名的页面保存64KB数据,包括有层次结构的基于 XML 的结构。(受信域名,例如 intranet 站点,可以存储10倍于这个数字,也就是640KB。这几乎对任何人都已经足够了。)IE 不会有任何授权对话框,也不能增加额外的存储空间。
2002年,Adobe 在 Flash 6 引入了一项新的特性,却有一个明显会误导的名字:Flash cookie。在 Flash 环境下,这个特性被称为 Local Shared Object。简单来说,它允许每个域名的 Flash 对象存储100KB数据。Brad Neuberg 开发了一个 Flash-JavaScript 桥的早期原型,称为 AMASS(AJAX Massive Storage System),但它受限于 Flash 的设计怪癖。直到2006年,Flash 8 提供了 ExternalInterface,这么一来就可以由 JavaScript 直接访问 LSO,因此访问速度提升了一个数量级,变得更简单更快速。Brad 重写了 AMASS,并将其集成在 Dojo Toolkit 的 dojox.storage 中。Flash 给每个域名100KB的自由空间。如果超出,则允许按照数量级增加(1Mb、10Mb等等)。
2007年,Google 提供了 Gears,一个开源的浏览器插件,旨在为浏览器提供额外的功能。(我们曾经在为 IE 提供地理位置API的时候介绍过 Gears。)Gears 提供了一组基于 SQLite 的嵌入式数据库的 API。只要用户一次授权,Gears 能够按照域名在 SQL 数据库表中存储无限大小的数据。
与此同时,Brad Neuberg 和其他人继续 dojox.storage 的开发,以提供一种对这类插件和 API 的统一的接口。2009年,dojox.storage 能够自动检测(在其上层提供一种统一的接口)Adobe Flash、Gears、Adobe AIR 和 HTML5 存储的早期原型(仅有 Firefox 的一个较老版本实现)。
正如你所看到的这些解决方案,它们都有或多或少的问题:不是特定于某一浏览器,就是需要安装第三方插件。我们还需要对不同之处做一种“屏蔽”(正如 dojox.storage 所做的那样),它们有着不同的接口、不同的存储限制、不同的用户体验。这就是 HTML5 所要解决的问题:提供一种标准的 API,由多种浏览器提供原生支持,不需要安装第三方插件。