从 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
可确保最大限度地提高数据持久性,但对于许多 Web 应用来说,relaxed
通常就足够了,并且可以通过以下方式显著提升性能
- 速度 - 在实际示例中,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
标志。
了解详情
如需了解有关此变更的更多技术详情和最新动态,请参阅跟踪 bug 和 Chrome 平台状态条目。
总而言之,Chrome 更改 IndexedDB 中默认持久性模式的举措旨在提高性能,同时保持与其他主要浏览器的兼容性。在大多数情况下,我们建议您不要执行任何操作,因为新的默认值会提升性能。如果需要,您可以继续指定首选持久性模式,从而控制 Web 应用中的数据持久性和性能。
致谢
本文由 Evan Stade 和 Rachel Andrew 审核。