Storage API

Baseline 广泛可用 *

此功能已成熟,可在多种设备和浏览器版本上使用。自 2021 年 12 月以来,它已在所有浏览器中可用。

* 此特性的某些部分可能存在不同级别的支持。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

Storage 标准定义了一个共享存储系统,旨在供网站用来在用户浏览器中存储数据的各种 API 和技术使用。

由 Storage 标准管理的网站数据通常包括 IndexedDB 数据库Cache API 数据,但也可能包含其他类型的网站可访问数据,例如 Web Storage API 数据

Storage API 使网站能够了解它们可以使用多少空间,已经使用了多少空间,甚至可以控制是否需要在 用户代理 清理数据以腾出空间时收到提醒。

本文概述了用户代理存储和维护网站数据的方式。有关存储限制和清除的更多信息,请参阅 浏览器存储配额和清除标准

本文还概述了用于估算网站可用存储的 StorageManager 接口。

概念与用法

存储桶

Storage 标准所描述的、用于存储网站数据的存储系统通常为每个 包含一个单独的存储桶

本质上,每个网站都有自己的存储空间用于存放其数据。但在某些情况下,用户代理可能会决定将单个源的数据存储在多个不同的存储桶中,例如当此源嵌入在不同的第三方源中时。

要了解更多信息,请参阅 浏览器如何区分来自不同网站的数据?

存储桶模式

每个网站存储桶都有一个模式,该模式描述了该存储桶的数据保留策略。有两种模式:

"best-effort"(尽力而为)

用户代理将尽可能长时间地保留存储桶中的数据,但如果存储空间不足且为了缓解存储压力需要清空存储桶,则不会向用户发出警告

"persistent"(持久)

用户代理将尽可能长时间地保留数据,在考虑清空标记为"persistent"的存储桶之前,会先清空所有"best-effort"存储桶。如果需要考虑清空持久存储桶,用户代理将通知用户并提供一种按需清空一个或多个持久存储桶的方式。

您可以使用 navigator.storage.persist() 方法来更改源的存储桶模式,该方法需要"persistent-storage" 用户权限

js
if (navigator.storage && navigator.storage.persist) {
  navigator.storage.persist().then((persistent) => {
    if (persistent) {
      console.log("Storage will not be cleared except by explicit user action");
    } else {
      console.log("Storage may be cleared by the UA under storage pressure.");
    }
  });
}

您还可以使用 navigator.storage.persisted() 方法来了解源的存储是否为持久存储。

js
if (navigator.storage && navigator.storage.persist) {
  navigator.storage.persisted().then((persistent) => {
    if (persistent) {
      console.log("Storage will not be cleared except by explicit user action");
    } else {
      console.log("Storage may be cleared by the UA under storage pressure.");
    }
  });
}

要了解更多信息,请参阅 浏览器存储的数据是否持久?

配额和使用量估算

用户代理使用它选择的任何机制来确定给定网站可以使用的最大存储量。这个最大值是源的配额。该空间被网站使用的量称为其使用量。这两个值都是估算值;它们不精确有几个原因:

  • 鼓励用户代理模糊给定源所使用数据的确切大小,以防止这些值被用于 指纹识别目的。
  • 可能会使用去重、压缩和其他方法来减小存储数据的实际大小。
  • 配额是源可用空间保守的估算值,应小于设备上的可用空间,以帮助防止溢出。

要确定给定源的估算配额和使用量值,请使用 navigator.storage.estimate() 方法,该方法返回一个 Promise,解析后接收一个包含这些数据的对象。例如:

js
navigator.storage.estimate().then((estimate) => {
  // estimate.quota is the estimated quota
  // estimate.usage is the estimated number of bytes used
});

有关源可以存储多少数据的更多信息,请参阅 可以存储多少数据?

数据清除

数据清除是用户代理删除源存储数据的过程。例如,当用于存储数据的设备存储空间不足时,可能会发生这种情况。

在清除源存储的数据时,源的存储桶被视为一个整体。此源存储的全部数据将被清除。

如果一个存储桶被标记为"persistent",除非数据源本身或用户明确执行此操作,否则用户代理不会清除其内容。这包括用户选择“清除缓存”或“清除最近历史记录”等场景。用户将被特别要求允许删除持久网站存储桶。

要了解更多信息,请参阅 何时会清除数据?

接口

StorageManager

提供了一个用于管理持久化权限和估算可用存储的接口。

其他接口的扩展

返回用于按站点/应用程序管理持久化权限和估算可用存储的单例 StorageManager 对象。

WorkerNavigator.storage 只读

返回一个 StorageManager 接口,用于管理持久化权限和估算可用存储。

规范

规范
Storage
# storagemanager

浏览器兼容性

另见