Wersjonowanie i aktualizacje
Proszę migrować schematy przy zmianach wersji.
Wersjonowanie i aktualizacje to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 4 lekcji w sumie.
Po co jest wersjonowanie?
Aplikacje ewoluują: dodaje się magazyny i indeksy albo zmienia sposób organizacji danych. IndexedDB używa numeru wersji, aby bezpiecznie zarządzać tymi zmianami schematu w przeglądarce każdego użytkownika.
Numer wersji
Drugim argumentem funkcji open jest wersja, będąca dodatnią liczbą całkowitą. Jej zwiększenie informuje przeglądarkę o zmianie schematu i uruchamia aktualizację.
// Bumping from 1 to 2 triggers onupgradeneeded:
const request = indexedDB.open('app-db', 2);Wersję można tylko zwiększać
Wersję można tylko zwiększać. Otwarcie bazy z numerem niższym niż zapisany kończy się błędem. Nigdy nie należy zmniejszać numeru wersji.
// If the stored DB is version 3:
const req = indexedDB.open('app-db', 2);
req.onerror = () => console.log('cannot open older version');oldVersion i newVersion
Wewnątrz onupgradeneeded zdarzenie udostępnia wartości oldVersion i newVersion. Należy ich używać, aby zastosować tylko te migracje, które nie zostały jeszcze wykonane.
request.onupgradeneeded = (e) => {
console.log('upgrading from', e.oldVersion, 'to', e.newVersion);
};Migracje przyrostowe
Solidnym wzorcem jest sekwencyjna migracja z wykorzystaniem oldVersion: każdy blok bazuje na poprzednim, dzięki czemu użytkownik dowolnej starszej wersji otrzymuje najnowszy schemat.
request.onupgradeneeded = (e) => {
const db = e.target.result;
if (e.oldVersion < 1) {
db.createObjectStore('notes', { keyPath: 'id' });
}
if (e.oldVersion < 2) {
db.createObjectStore('tags', { keyPath: 'name' });
}
};Późniejsze dodawanie indeksu
Aby dodać indeks do istniejącego magazynu podczas aktualizacji, należy pobrać magazyn z transakcji aktualizacji i wywołać na nim createIndex.
request.onupgradeneeded = (e) => {
if (e.oldVersion < 3) {
const store = e.target.transaction.objectStore('notes');
store.createIndex('byDate', 'createdAt');
}
};Transakcja zmiany wersji
Podczas wykonywania onupgradeneeded właściwość transaction zdarzenia zawiera specjalną transakcję typu versionchange. Jest to jedyny kontekst, w którym można jednocześnie modyfikować schemat i migrować dane.
request.onupgradeneeded = (e) => {
const tx = e.target.transaction; // versionchange tx
const store = tx.objectStore('notes');
// migrate existing records here if needed
};Migrowanie istniejących danych
Jeśli zmiana schematu wymaga przekształcenia rekordów, należy przeiterować po magazynie za pomocą kursora wewnątrz aktualizacji, a następnie zapisać przekształcone wartości z powrotem za pomocą put.
const store = e.target.transaction.objectStore('notes');
store.openCursor().onsuccess = (ev) => {
const cursor = ev.target.result;
if (cursor) {
const note = cursor.value;
note.archived = false; // new field
cursor.update(note);
cursor.continue();
}
};Zdarzenie versionchange
Gdy jedna karta aktualizuje bazę, inne karty korzystające ze starszej wersji otrzymują w obiekcie db zdarzenie versionchange. Powinny one zamknąć połączenia, aby nie blokować aktualizacji.
db.onversionchange = () => {
db.close(); // let the other tab upgrade
console.log('database is outdated, please reload');
};Usuwanie magazynów
Niepotrzebny magazyn można usunąć podczas aktualizacji za pomocą db.deleteObjectStore(name). Spowoduje to trwałe usunięcie magazynu wraz z jego danymi.
request.onupgradeneeded = (e) => {
const db = e.target.result;
if (e.oldVersion < 4 && db.objectStoreNames.contains('temp')) {
db.deleteObjectStore('temp');
}
};Najlepsze praktyki dotyczące aktualizacji
Należy dbać o idempotentność migracji i wykonywać je w kolejności określonej przez oldVersion, zamykać stare połączenia po zdarzeniu versionchange oraz testować aktualizacje z każdej wcześniejszej wersji. Dzięki temu dane powracających użytkowników pozostaną nienaruszone.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat wersjonowania i aktualizacji.
Podsumowanie
Dowiedział się Pan / Dowiedziała się Pani, czym są wersjonowanie i aktualizacje:
- Zwiększenie numeru wersji uruchamia
onupgradeneeded. oldVersionsłuży do przeprowadzania przyrostowych i idempotentnych migracji.- Transakcja
versionchangeaktualizacji modyfikuje schemat i dane. - Rekordy migruje się za pomocą kursora i
cursor.update. - Stare karty należy zamykać po zdarzeniu
versionchange.
Ukończył Pan / Ukończyła Pani naukę IndexedDB. Następnie Service Workers.
Często zadawane pytania
Czy lekcja „Wersjonowanie i aktualizacje” jest bezpłatna?
Tak — pełny tekst „Wersjonowanie i aktualizacje” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wersjonowanie i aktualizacje”?
Proszę migrować schematy przy zmianach wersji. Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?
Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wersjonowanie i aktualizacje”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?
Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Otwieranie bazy danych
- Transakcje i CRUD
- Indeksy i zapytania
- Wersjonowanie i aktualizacje