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 Stade 和 Rachel Andrew 审核。