W Chrome 121 domyślny tryb trwałości w IndexedDB zmienia się z strict
na relaxed
. Ta zmiana ma na celu zwiększenie wydajności i dopasowanie do innych najpopularniejszych przeglądarek, takich jak Firefox czy Safari. W poście na blogu znajdziesz szczegółowe informacje o tej zmianie i jej skutkach dla programistów stron internetowych.
Tryby trwałości IndexedDB
IndexedDB, zaawansowany interfejs API do przechowywania dużych ilości uporządkowanych danych, ma 2 tryby trwałości w przypadku transakcji readwrite
:
strict
: ten tryb wyraźnie instruuje system operacyjny, aby wyczyścić zmiany na dysku przed uruchomieniem zdarzeniacomplete
.relaxed
Ten tryb zależy od domyślnego działania opróżniania systemu operacyjnego i wysyła zdarzeniecomplete
po wprowadzeniu zmian do bufora systemu operacyjnego, który jest zwykle usuwany co kilka sekund.
Pamiętaj, że strict
nie gwarantuje, że zmiany zostaną faktycznie natychmiast zapisane na dysku. Po wywołaniu funkcji put()
strona jeszcze przez pewien czas może utracić zasilanie, które może spowodować, że zmiana nie zapisze się na dysku i nie zostanie usunięta przy następnym uruchomieniu aplikacji.
W przypadku gwarancji o trwałości strict
zdarzenie complete
transakcji IndexedDB jest wywoływane po faktycznym zapisaniu danych. Natomiast w przypadku trwałości relaxed
dane są nadal w procesie zapisywania po wywołaniu zdarzenia complete
. (Więcej informacji o całym procesie znajdziesz w tym wyjaśnieniu).
Dlatego tak naprawdę strict
przydaje się tylko w przypadku operacji, w przypadku których koniecznie musisz wiedzieć, że został napisany, zanim wykonasz kolejną czynność. Przykładem, w którym strict
jest wytrzymałość, jest migracja danych. Podczas przenoszenia danych z jednego magazynu kopii zapasowych do innego nie chcesz usuwać starego formatu, dopóki nie zostanie zapisany nowy format. W ten sposób trwałość strict
ułatwia rutynę migracji, która może zostać cofnięta po awarii w połowie migracji.
Zmiana domyślnego trybu trwałości
Najważniejszym aspektem tej zmiany jest domyślny tryb trwałości w przypadku transakcji readwrite
w Chrome. Do tej pory wartość domyślna to strict
, co zapewnia natychmiastowe zapisywanie na dysku w przypadku zmian danych. Jednak ze względu na kwestie związane z wydajnością oraz aby dostosować się do innych najpopularniejszych przeglądarek, z których wszystkie korzystają z relaxed
, Chrome także planuje zmienić ustawienie domyślne na relaxed
.
Ta zmiana ma zapewnić lepszą równowagę między wydajnością a trwałością danych. Chociaż zasada strict
zapewnia maksymalną trwałość danych, relaxed
często wystarcza do wielu aplikacji internetowych i może znacznie poprawić wydajność w następujący sposób:
- Szybkość – na rzeczywistych przykładach zespół Chrome zauważył wzrost szybkości między 3 a 30.
- trwałość dysku, zwłaszcza w przypadku urządzeń z dyskiem SSD.
- Wydłużona żywotność baterii.
- Poprawiona szybkość odczytu. Ze względu na architekturę IndexedDB, gdzie transakcje odczytu są często blokowane w ramach transakcji zapisu, szybkość odczytu jest dodatkowo zwiększana.
- Ma to pozytywny wpływ na całe urządzenie, bo operacje na dysku są współdzielonym zasobem systemowym.
Współdziałanie i zgodność
Ważnym aspektem tej zmiany jest jej wpływ na interoperacyjność i zgodność. Dopasowując się do zachowań innych popularnych dostawców przeglądarek, Chromium zwiększa interoperacyjność. Sam standard zezwala na różne implementacje, a ta zmiana ma na celu ich harmonizację. Kontekst historyczny znajdziesz w tym problemie na GitHubie.
Co to oznacza dla programistów stron internetowych?
Ta zmiana nie wprowadza żadnych nowych interfejsów API. Istniejący interfejs IndexedDB API pozostaje bez zmian, a ta zmiana wpływa głównie na domyślne działanie transakcji readwrite
. Podczas tworzenia transakcji możesz określić preferowany tryb trwałości, co zapewnia kontrolę nad trwałością i wydajnością danych. Poniższy przykładowy kod pokazuje, jak przywrócić stare zachowanie przez ustawienie durability
na strict
w 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 wysłaniem
Zmiana zacznie obowiązywać w Chrome 121. Jeśli chcesz wcześniej przetestować nowe działanie lokalnie, włącz flagę #indexed-db-default-durability-relaxed
w narzędziu chrome://flags
.
Więcej informacji
Więcej szczegółów technicznych i aktualności dotyczących tej zmiany znajdziesz na stronach o błędzie śledzenia i wpisie o stanie platformy Chrome.
Podsumowując, przejście w Chrome na zmianę domyślnego trybu trwałości w IndexedDB ma na celu poprawę wydajności przy zachowaniu zgodności z innymi najpopularniejszymi przeglądarkami. W większości przypadków zalecamy nie podejmować żadnych działań, ponieważ nowe ustawienia domyślne zapewnią lepszą wydajność. W razie potrzeby możesz dalej określać preferowany tryb trwałości, przejmując kontrolę nad trwałością i wydajnością danych w aplikacjach internetowych.
Podziękowania
Artykuł napisali Evan Stade i Rachel Andrew.