變更 IndexedDB 中的預設耐用性模式

從 Chrome 121 開始,IndexedDB 中的預設耐用性模式將從 strict 變更為 relaxed。這項調整旨在提升效能,並與 Firefox 和 Safari 等其他主要瀏覽器保持一致。這篇網誌文章會說明這項異動的詳細內容,以及對網頁開發人員的影響。

IndexedDB 耐久性模式

IndexedDB 是用於儲存大量結構化資料的強大網頁 API,可為 readwrite 交易提供兩種耐用性模式:

  • strict這個模式會明確指示作業系統在發出 complete 事件前,先將變更內容刷新至磁碟。
  • relaxed 這個模式會依賴預設的 OS 沖洗行為,並在變更傳送至 OS 緩衝區後,發出 complete 事件,而 OS 緩衝區通常會每隔幾秒就沖洗一次。

請特別注意,strict 無法確保變更會「實際」立即寫入磁碟。網站呼叫 put() 後,仍有一段時間內,電力故障可能會導致變更無法寫入磁碟,因此在下次執行應用程式時,變更內容就會遺失。

strict 耐用性保證方面,只有在資料實際寫入,IndexedDB 交易 complete 事件才會觸發;而使用 relaxed 耐用性時,complete 事件觸發時,資料仍處於寫入過程。(如要進一步瞭解整個程序,請參閱這篇說明文章)。

因此,strict 只適用於您「絕對」需要在執行下一個操作前,先知道該操作已寫入的作業。資料遷移就是需要 strict 耐用性的例子。從一個備份儲存空間移至另一個備份儲存空間時,您不想刪除舊格式,直到新格式已寫入。如此一來,strict 耐用性就能促進遷移例行程序,讓您在過程中發生故障時能復原。

預設耐用性模式變更

這項變更的關鍵之處,在於 Chrome 中 readwrite 交易的預設耐用性模式。目前預設值為 strict,可確保資料變更立即寫入磁碟。不過,基於效能考量,以及為了與其他主要瀏覽器保持一致 (這些瀏覽器都使用 relaxed),Chrome 也打算將預設值改為 relaxed

這項異動旨在讓效能和資料耐用性之間取得更好的平衡。雖然 strict 可確保資料的最大耐用性,但對於許多網頁應用程式來說,relaxed 通常就足夠了,而且還能透過下列方式大幅提升效能:

  • 速度:在實際案例中,Chrome 團隊發現速度提升了 3 到 30 倍。
  • 磁碟耐用性,特別是裝置使用固態硬碟 (SSD) 時。
  • 延長電池續航力。
  • 改善讀取速度。由於 IndexedDB 的架構會經常阻斷讀取交易,因此讀取速度會受到影響。
  • 磁碟作業是共用系統資源,因此整部裝置都會受到影響。

互通性和相容性

這項變更的一個重要面向,是對互通性和相容性的影響。透過與其他主要瀏覽器供應商的行為保持一致,Chromium 可改善互通性。標準本身允許不同的實作方式,而這項變更旨在協調這些實作方式。如要進一步瞭解這項異動的歷史背景,請參閱 這個 GitHub 問題

這對網頁開發人員有何影響?

這項變更不會引入任何新的 API 介面。現有的 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 中預設耐用性模式的做法,旨在提升效能,同時維持與其他主要瀏覽器的相容性。在大多數情況下,我們建議您不必採取任何行動,因為新的預設值可提升效能。如有需要,您可以繼續指定偏好的耐用性模式,控管網頁應用程式的資料耐用性和效能。

特別銘謝

本文由 Evan StadeRachel Andrew 審查。