Storage API - 让站点知道存储空间使用和变化情况

安全上下文
该功能仅在部分或所有支持的浏览器中的安全上下文(HTTPS)中可用。

注意: 此特性在 Web Worker 中可用。

存储标准定义了一个通用的共享存储系统,供所有为单个网站存储内容可访问数据的 API 和技术使用。Storage API(存储 API)使站点的代码能够知道它们可以使用多少空间,它们已经使用了多少空间,甚至可以控制在用户代理处理站点数据之前是否需要提醒它们,以便为其他事情腾出空间。

站点存储 - 由存储标准管理的为网站存储的数据 - 包括了:

站点存储单元

由存储标准描述并使用存储 API 进行交互的站点存储系统由每个Origin 的单个站点存储单元组成。从本质上讲,每个网站或 Web 应用程序都有自己的存储单元来存放数据。下图显示了一个包含三个存储单元的站点存储池,其中显示了存储单元可以存储不同的数据类型,并且可能具有不同的配额 (最大存储限制)。

该图显示了站点存储池如何由多个存储单元组成,这些存储单元包含来自各种 API 的数据,以及在达到配额之前可能剩余的未使用空间。

  • 源 1 有一些 Web 存储数据和一些 IndexedDB 数据,但也有一些剩余的可用空间;它目前的使用量还没有达到它的配额。
  • 源 2 还没有存储数据;它只是一个等待内容的空盒子。但是,这个源的配额低于其他两个来源。 它可能是一个访问量较少的站点,或者是一个已知具有较低数据存储要求的站点。
  • 源 3 的存储单元完全满了;它已经达到了配额,在不移除一些现有资料的情况下无法存储更多数据。

用户代理可能使用各种技术来确定各种源的配额。最有可能的方法之一 -- 事实上是规范特别鼓励的方法 -- 将是考虑个别网站的受欢迎程度和 / 或使用水平,以确定它们的配额应该是多少。也可以想象,浏览器可能会提供一个用户界面来定制这些配额。

盒子模式

每个站点存储单元中的实际数据存储称为其盒子。每个站点存储单元只有一个盒子,所有数据都放在其中,并且有一个描述该盒子的数据保留策略的盒子模式。有两种模式:

"best-effort"

用户代理将尝试尽可能长时间地保留盒子中包含的数据,但如果存储空间不足并且有必要清除框以缓解存储压力,则不会警告用户

"persistent"

用户代理将尽可能长时间地保留数据,在考虑清除标有 "best-effort" 的盒子之前,清除所有 "persistent" 盒子。如果需要考虑清除持久框,用户代理将通知用户,并根据需要提供清除一个或多个持久盒子的方法。

更改源的盒子模式需要拥有 "persistent-storage" 功能的使用权限。

数据持久化和清除

如果站点或应用程序拥有 "persistent-storage" 功能权限,则可以使用 StorageManager.Persistent() 方法请求将其盒子持久化。用户代理也可以根据使用特征或其他指标来决定使站点的存储单元持久化。 "persistent-storage" 功能的权限相关标志、算法和类型都被设置为权限的标准默认设置。权限状态必须在整个源站保持相同,如果权限状态不是 "granted"(不管是什么原因,持久化存储功能被拒绝访问),源站存储单元的盒子模式总是 "best-effort"

注意: 有关获取和管理权限的更多详细信息,请参阅使用权限 API

当清除站点存储单元时,源的盒子被视为单个实体;如果用户代理需要清除它并且用户批准,则将清除整个数据存储,而不是提供某种方法来仅清除来自单个 API 的数据。

如果盒子被标记为 "persistent",则用户代理不会在没有数据源本身或用户明确要求的情况下清除内容。这包括诸如用户选择 “清除缓存” 或 “清除最近历史记录” 选项的场景。将特别询问用户移除永久性站点存储单元的许可。系统将专门询问用户是否允许删除永久站点存储单元。

配额和使用量估计

用户代理使用它选择的任何机制来确定给定站点可以使用的最大存储量。此最大值为源站的配额。该站点正在使用的空间大小称为其使用量。这两个值都是估计值;有几个原因导致它们不准确:

  • 鼓励用户代理隐藏给定来源使用的数据的确切大小,以防止这些值被用于识别用户。
  • 可以使用去重复、压缩和其他方法来减小存储数据的物理大小。
  • 配额是对源设备可用空间的保守估计,应该小于设备上的可用空间,以帮助防止溢出。

用户代理可以使用他们选择的任何方法来确定来源配额的大小,并且规范鼓励为流行或经常使用的站点提供额外的空间。

要确定给定来源的估计配额和使用值,请使用 Navigator.storage.restiate() 方法,该方法返回一个承诺,该承诺在解析时将接收包含这些数字的对象。例如:

navigator.storage.estimate().then(estimate => {
  // estimate.quota 预估配额
  // estimate.usage 是估计使用的字节数。
});

规范

规范
Storage Living Standard

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持48≤79

57

51 — 571

不支持 支持 未知
estimate52≤7951 不支持 支持 未知
persist

52

48 — 522

≤7955 不支持 支持 未知
persisted

52

48 — 523

≤7955 不支持 支持 未知

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持4848 未知511 未知 支持 未知
estimate5252 未知51 未知 支持 未知
persist

52

48 — 522

52

48 — 522

未知55 未知 支持 未知
persisted

52

48 — 523

52

48 — 523

未知55 未知 支持 未知

1. 参见 bug 1304966bug 1399038

2. 通过 requestPersistent 支持。

3. 通过 persistentPermission 支持。

相关链接