永久存储

永久性存储有助于防止关键数据被逐出,并降低数据丢失的可能性。

当面临磁盘可用空间不足等存储压力时,浏览器 通常会逐出数据(包括从 Cache API 和 IndexedDB 中逐出), 从最近最少使用的来源获取。如果应用被删除, 尚未与服务器同步数据,因而应用的可靠性会降低 移除应用正常运行所需的资源,这两种情况都会导致 负面用户体验。

幸运的是,Chrome 小组的研究表明, 已被 Chrome 自动清除。用户通常通过手动方式 清除存储空间。因此,如果用户经常访问您的网站 您的数据将被逐出。防止浏览器删除 您可以请求将整个网站的存储空间 永久性存储

许多现代浏览器都支持永久性存储。

浏览器支持

  • Chrome:55。 <ph type="x-smartling-placeholder">
  • Edge:79。 <ph type="x-smartling-placeholder">
  • Firefox:57。 <ph type="x-smartling-placeholder">
  • Safari:15.2. <ph type="x-smartling-placeholder">

来源

如需详细了解逐出、您可以存储的内容量以及如何处理配额 限制,请参阅网络存储空间

检查您网站的存储空间是否已标记为永久性存储空间

您可以使用 JavaScript 确定您网站的存储空间是否已被标记 作为永久性的调用 navigator.storage.persisted() 会返回一个 Promise, 解析一个布尔值,表示存储空间是否已标记为 保存状态。

// Check if site's storage has been marked as persistent
if (navigator.storage && navigator.storage.persist) {
  const isPersisted = await navigator.storage.persisted();
  console.log(`Persisted storage granted: ${isPersisted}`);
}

何时应该请求永久性存储?

请求将您的存储空间标记为永久存储空间的最佳时机是 保存关键用户数据,并且理想情况下,应将请求封装在用户 手势。请勿在页面加载时或其他引导加载程序中请求永久性存储空间 代码,浏览器可能会提示用户授予权限。如果用户 没有执行他们认为需要保存的任何操作,提示可能 他们很可能会拒绝请求此外,不要提示 过于频繁如果用户决定不授予权限,请勿立即 系统会在下次保存时再次提示您

请求永久性存储空间

要为网站数据请求永久性存储空间,请调用 navigator.storage.persist()。它会返回一个使用 布尔值,指示是否已授予永久性存储权限。

// Request persistent storage for site
if (navigator.storage && navigator.storage.persist) {
  const isPersisted = await navigator.storage.persist();
  console.log(`Persisted storage granted: ${isPersisted}`);
}

如何授予权限?

永久性存储被视为权限。浏览器使用 来决定是否授予永久性存储权限。

Chrome 和其他基于 Chromium 的浏览器

Chrome 和大多数其他基于 Chromium 的浏览器会自动处理 权限请求,且不向用户显示任何提示。相反,如果 永久存储权限 否则,系统会静默拒绝该请求。

判断网站是否重要的方法包括:

  • 网站互动度有多高?
  • 网站是否已安装或加入书签?
  • 该网站是否已获得显示通知的权限?

如果请求被拒绝,可以稍后再次请求, 使用相同的启发法进行评估。

Firefox

Firefox 将权限请求委托给用户。永久性存储 时,系统会显示一个界面弹出窗口来提示用户,询问他们是否允许 将数据存储在永久性存储空间中。

<ph type="x-smartling-placeholder">
</ph> Firefox 在网站请求永久存储时显示的弹出式窗口。 <ph type="x-smartling-placeholder">
</ph> Firefox 在网站请求永久存储时显示的弹出式窗口。

什么存储空间受永久性存储的保护?

授予永久存储权限后,浏览器不会逐出 数据存储在:

  • Cache API
  • Cookie
  • DOM 存储(本地存储)
  • File System API(浏览器提供的沙盒文件系统)
  • IndexedDB
  • Service Worker
  • 应用缓存(已弃用,不应使用)
  • WebSQL(已弃用,不应使用)

如何关闭永久性存储

目前,您无法通过编程方式告诉浏览器 需要永久性存储空间

总结

Chrome 小组的研究表明,虽然可能, Chrome 很少自动清除这类数据。为了保护可能出现以下情况的关键数据 不会存储在云端,否则会导致数据丢失, 永久性存储是一项有用的工具,可确保您的数据 本地设备面临存储压力时被浏览器移除。 请记住,仅在用户最有可能 。

谢谢

特别感谢 Victor Costan 和 Joe Medley 对本文的评价。 感谢 Chris Wilson 撰写本文的原始版本, 首次出现在 WebFundamentals 上

Umberto 在 Unshot 上使用的主打图片