變更索引資料庫的預設耐用性模式

IndexedDB 的預設耐用模式從 Chrome 121 變更為 strictrelaxed這項調整是為了提升效能,並與其他主要瀏覽器 (例如 Firefox 和 Safari) 保持一致。這篇網誌文章說明瞭這項異動的詳情以及對網頁程式開發人員的影響。

索引資料庫耐用模式

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

  • strict這個模式會明確指示 OS 在發出 complete 事件前清除磁碟變更。
  • relaxed 這個模式依附於預設的 OS 清除行為,並會在對 OS 緩衝區進行變更後發出 complete 事件,此事件通常每隔幾秒就會清除。

請注意,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 藉由變更已建立索引資料庫的預設耐用模式,目標是提升效能並與其他主要瀏覽器的相容性。在大多數情況下,我們都建議不採取任何行動,因為新的預設設定可提升成效。如有需要,您可以繼續指定偏好的耐用模式,控管網頁應用程式的資料耐用性和效能。

特別銘謝

這篇文章是由 Evan StadeRachel Andrew 評論。