IndexedDB 中的默认耐用模式发生变化

Chrome 121 中的 IndexedDB 的默认持久性模式从 strict 更改为 relaxed。这一调整是为了提升性能,并与 Firefox 和 Safari 等其他主流浏览器保持一致。此博文详细介绍了这项变更及其对 Web 开发者的影响。

IndexedDB 持久性模式

IndexedDB 是一个用于存储大量结构化数据的强大 Web API,为 readwrite 事务提供了两种持久性模式:

  • strict:此模式会明确指示操作系统在发出 complete 事件之前刷新磁盘的更改。
  • relaxed 此模式依赖于默认的操作系统刷新行为,并在对操作系统缓冲区进行更改后发出 complete 事件(通常每隔几秒就会刷新一次)。

请务必注意,strict 并不能确保更改实际上会写入磁盘。在网站调用 put() 之后,仍存在一段有限的时间。在此期间,电源故障可能会导致更改无法载入磁盘,从而在应用下次运行时缺失。

为了确保 strict 持久性,IndexedDB 事务 complete 事件在数据实际写入之后才会触发,而对于 relaxed 持久性,当 complete 事件触发时,数据仍处于写入过程中。(如需详细了解整个流程,请查看此铺垫消息。)

因此,strict 实际上仅适用于符合以下条件的操作:您绝对需要知道它已写入,然后再执行下一个操作。数据迁移就是一个要求 strict 耐用性的示例。从一个后备存储空间移到另一个后备存储空间时,在写入新格式之前,您不需要删除旧格式。这样,strict 的耐用性就可以促进迁移例程(可以在中途从故障中恢复)。

默认耐用性模式发生变化

这项变更的关键在于,Chrome 中的 readwrite 事务的默认持久性模式是默认持久性模式。到目前为止,默认值为 strict,可确保在发生数据更改时立即写入磁盘。不过,出于性能方面的考虑,并且为了与所有使用 relaxed 的其他主流浏览器保持一致,Chrome 同样计划将默认值更改为 relaxed

这项变更旨在更好地平衡性能和数据耐用性。虽然 strict 可以确保最高的数据持久性,但 relaxed 通常足以满足许多 Web 应用的需求,并且可以通过以下方式显著提高性能

  • 速度 - 在实际例子中,Chrome 团队发现速度提高了 3 到 30 倍。
  • 磁盘耐用性,尤其是对于采用固态硬盘 (SSD) 的设备。
  • 电池续航时间更持久。
  • 读取速度提升。由于 IndexedDB 的架构经常在写入事务后面阻塞读取事务,因此,读取速度作为次要效应得到提升。
  • 整个设备都会受到积极影响,因为磁盘操作是共享的系统资源。

互操作性和兼容性

这项变更的一个重要方面是它对互操作性和兼容性的影响。Chromium 通过与其他主流浏览器供应商的行为保持一致,从而提升了互操作性。该标准本身允许不同的实现,此更改旨在使这些实现协调一致。您可以在此 GitHub 问题中找到关于此变更的更多历史背景信息。

这对 Web 开发者有什么影响?

此更改不会引入任何新的 API Surface。现有的 IndexedDB API 仍保持不变,此更改主要影响 readwrite 事务的默认行为。您可以在创建事务时指定偏好的持久性模式,从而控制数据持久性和性能。以下代码示例展示了如何通过在可选选项数组中将 durability 设置为 strict 来恢复旧行为。

let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
  db = DBOpenRequest.result;
};
const transaction = db.transaction(
  ['toDoList'],
  'readwrite',
  { durability: 'strict' });

在发布更改之前在本地对其进行测试

此更改将在 Chrome 121 中生效。如果您想先在本地测试新行为,请在 chrome://flags 中切换 #indexed-db-default-durability-relaxed 标志。

了解详情

如需了解此项变更的更多技术详情和更新,请查看跟踪错误Chrome 平台状态条目

总而言之,Chrome 对 IndexedDB 中的默认持久性模式进行了更改,目的是在保持与其他主流浏览器的兼容性的同时提高性能。在大多数情况下,我们建议您什么也不做,因为新的默认设置将提升性能。如果需要,您可以继续指定偏好的耐用性模式,从而控制 Web 应用中的数据耐用性和性能。

致谢

本文由 Evan StadeRachel Andrew 审核。