Od wersji 121 Chrome domyślny tryb trwałości w IndexedDB zmieni się z strict
na relaxed
. Ta zmiana ma na celu poprawę wydajności i dostosowanie się do innych popularnych przeglądarek, takich jak Firefox i Safari. W poście na blogu znajdziesz szczegółowe informacje o tej zmianie i jej konsekwencjach dla programistów internetowych.
Tryby trwałości IndexedDB
IndexedDB to potężne interfejsy internetowe API do przechowywania dużych ilości uporządkowanych danych. Oferuje 2 tryby trwałości transakcji readwrite
:
strict
: w tym trybie system operacyjny otrzymuje wyraźną instrukcję, aby przed wysłaniem zdarzeniacomplete
zapisać zmiany na dysku.relaxed
W tym trybie korzystanie z domyślnego zachowania systemu operacyjnego, a zdarzeniecomplete
jest wysyłane po tym, jak zmiany trafią do bufora systemu operacyjnego, który jest zwykle opróżniany co kilka sekund.
Pamiętaj, że strict
nie gwarantuje, że zmiany zostaną natychmiast zapisane na dysku. Po wywołaniu przez stronę funkcji put()
nadal pozostaje ograniczony czas, w którym awaria zasilania może spowodować, że zmiana nie zostanie zapisana na dysku i nie będzie widoczna przy następnym uruchomieniu aplikacji.
W przypadku gwarancji z trwałością strict
zdarzenie transakcji IndexedDB complete
nie jest wywoływane, dopóki dane nie zostaną zapisane, podczas gdy w przypadku trwałości relaxed
dane są nadal w trakcie zapisywania, gdy zdarzenie complete
zostanie wywołane. (więcej informacji o całym procesie znajdziesz w tym artykule).
Funkcja strict
jest więc przeznaczona tylko do operacji, w przypadku których koniecznie musisz wiedzieć, że zostały one zapisane przed wykonaniem kolejnej czynności. Migracja danych jest przykładem sytuacji, w której wymagana jest trwałość strict
. Podczas przenoszenia z jednego magazynu na inny nie należy usuwać starego formatu, dopóki nie zostanie zapisany nowy. Dzięki temu trwałość strict
ułatwia rutynę migracji, która może odzyskać dane po awarii w połowie procesu.
Domyślna zmiana trybu trwałości
Kluczowym aspektem tej zmiany jest domyślny tryb trwałości w przypadku transakcji readwrite
w Chrome. Do tej pory domyślna wartość wynosiła strict
, co zapewniało natychmiastowe zapisywanie zmian danych na dysku. Ze względu na wydajność i po to, aby dostosować się do innych popularnych przeglądarek, które używają relaxed
, Chrome planuje również zmienić domyślną wartość na relaxed
.
Ta zmiana ma na celu zapewnienie lepszej równowagi między skutecznością a trwałością danych. Chociaż strict
zapewnia maksymalną trwałość danych, relaxed
często wystarcza w przypadku wielu aplikacji internetowych i może znacznie poprawić wydajność w następujący sposób:
- Szybkość – w przypadku przykładów z życia zespół Chrome zaobserwował wzrost szybkości od 3 do 30 razy.
- trwałość dysku, zwłaszcza w przypadku urządzeń z dyskiem półprzewodnikowym (SSD);
- wydłużony czas pracy na baterii;
- poprawa szybkości czytania; Ze względu na architekturę IndexedDB, w której transakcje odczytu są często blokowane przez transakcje zapisu, prędkość odczytu jest zwiększana jako efekt uboczny.
- Cały system korzysta z tych funkcji, ponieważ operacje na dysku są współdzielonym zasobem systemowym.
Interoperacyjność i zgodność
Ważnym aspektem tej zmiany jest jej wpływ na interoperacyjność i zgodność. Dzięki dopasowaniu do działania innych głównych dostawców przeglądarek Chromium poprawia interoperacyjność. Sam standard umożliwia różne implementacje, a ta zmiana ma na celu ich harmonizację. Więcej informacji o historii tej zmiany znajdziesz w tym wątku na GitHubie.
Co to oznacza dla programistów stron internetowych?
Ta zmiana nie wprowadza żadnych nowych interfejsów API. Dotychczasowy interfejs IndexedDB pozostaje bez zmian, a ta zmiana wpływa głównie na domyślne zachowanie transakcji readwrite
. Podczas tworzenia transakcji możesz określić preferowany tryb trwałości, co pozwoli Ci kontrolować trwałość i wydajność danych. Poniższy przykładowy kod pokazuje, jak przywrócić poprzednie działanie, ustawiając wartość durability
na strict
w opcjonalnej tablicy opcji.
let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
db = DBOpenRequest.result;
};
const transaction = db.transaction(
['toDoList'],
'readwrite',
{ durability: 'strict' });
Testowanie zmiany lokalnie przed jej wdrożeniem
Zmiana zacznie obowiązywać w Chrome 121. Jeśli chcesz najpierw przetestować nowe zachowanie lokalnie, włącz flagę #indexed-db-default-durability-relaxed
w sekcji chrome://flags
.
Więcej informacji
Więcej informacji technicznych i aktualizacje dotyczące tej zmiany znajdziesz w artykule o śledzeniu błędu oraz w artykule o stanie platformy Chrome.
Podsumowując, zmiana domyślnego trybu trwałości w IndexedDB w Chrome ma na celu poprawę wydajności przy zachowaniu zgodności z innymi głównymi przeglądarkami. W większości przypadków zalecamy, aby nic nie robić, ponieważ nowe ustawienia domyślne poprawią skuteczność. W razie potrzeby możesz nadal określać preferowany tryb trwałości, aby kontrolować trwałość danych i wydajność aplikacji internetowych.
Podziękowania
Ten artykuł został sprawdzony przez Evana Stade i Rachel Andrew.