0Pricing
JavaScript Academy · Lekcja

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.
  • oldVersion służy do przeprowadzania przyrostowych i idempotentnych migracji.
  • Transakcja versionchange aktualizacji 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

  1. Otwieranie bazy danych
  2. Transakcje i CRUD
  3. Indeksy i zapytania
  4. Wersjonowanie i aktualizacje
← Powrót do JavaScript Academy