從 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 Stade 和 Rachel Andrew 審查。