Signatur
Beschreibung
Mit add() teilt eine Progressive Web App dem Browser mit, dass ein bestimmter Inhalt offline verfügbar ist. Der Browser kann diese Einträge dann an einer eigenen Stelle zeigen, etwa im Bereich „Artikel für dich“ oder unter den Downloads in Chrome für Android. So findet der Nutzer zwischengespeicherte Inhalte auch ohne Netz.
Die Methode erreichst du über ServiceWorkerRegistration.index, also im Fenster über navigator.serviceWorker.ready oder direkt im Service Worker über self.registration.index. Rufe add() erst auf, nachdem der Inhalt wirklich im Cache liegt, zum Beispiel über die Cache API. Der Content Index speichert nur Metadaten und keine Daten.
Gibst du eine id an, die schon existiert, wird der alte Eintrag ersetzt. Löscht der Nutzer einen Eintrag in der Browser-Oberfläche, feuert im Service Worker das Event contentdelete. Dort solltest du den passenden Cache-Eintrag ebenfalls entfernen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $description Pflicht | Object | Metadaten des Inhalts mit folgenden Feldern:
|
Rückgabewert
TypeError abgelehnt, wenn Pflichtfelder fehlen oder leer sind, die url außerhalb des Service-Worker-Scopes liegt, ein Icon nicht geladen werden kann oder kein aktiver Service Worker vorhanden ist.Beispiele
Artikel aus der Seite heraus registrieren
const saveArticleOffline = async (article) => {
const registration = await navigator.serviceWorker.ready;
// Feature-Erkennung
if (!('index' in registration)) {
console.log('Content Index wird nicht unterstützt.');
return;
}
// Zuerst den Inhalt cachen ...
const cache = await caches.open('articles-v1');
await cache.add(article.url);
// ... dann im Content Index eintragen
try {
await registration.index.add({
id: `article-${article.id}`,
title: article.title,
description: article.teaser,
category: 'article',
url: article.url,
icons: [{ src: '/icons/article-192.png', sizes: '192x192', type: 'image/png' }]
});
console.log('Artikel offline verfügbar:', article.title);
} catch (err) {
console.error('Registrierung fehlgeschlagen:', err.message);
}
};
saveArticleOffline({
id: 42,
title: 'Service Worker verstehen',
teaser: 'Grundlagen für Offline-Apps',
url: '/artikel/service-worker-verstehen'
});
Im Service Worker nach periodischem Sync hinzufügen
// sw.js
self.addEventListener('periodicsync', (event) => {
if (event.tag !== 'latest-news') return;
event.waitUntil((async () => {
const res = await fetch('/api/news/latest');
const news = await res.json();
const cache = await caches.open('news');
for (const item of news) {
await cache.add(item.url);
await self.registration.index.add({
id: item.id,
title: item.title,
description: item.summary,
category: 'article',
url: item.url
});
}
})());
});
Aufräumen, wenn der Nutzer einen Eintrag löscht
// sw.js
self.addEventListener('contentdelete', (event) => {
event.waitUntil((async () => {
const cache = await caches.open('articles-v1');
const keys = await cache.keys();
const id = event.id.replace('article-', '');
for (const request of keys) {
if (request.url.includes(`/artikel/${id}`)) {
await cache.delete(request);
}
}
console.log('Entfernt:', event.id);
})());
});
// Wichtig · Fallstricke
- Experimentell und nur in Chromium: Die API funktioniert in Chrome und Edge ab Version 84, sinnvoll vor allem auf Android. Firefox und Safari unterstützen sie nicht. Prüfe deshalb immer mit
'index' in registration, ob sie verfügbar ist. - Die API läuft nur in einem sicheren Kontext (HTTPS) und braucht einen aktiven Service Worker.
- Die
urlmuss im Scope des Service Workers liegen, sonst gibt es einenTypeError. Leere Werte fürid,title,descriptionoderurlführen ebenfalls zu einemTypeError. - Trage nur Inhalte ein, die wirklich offline funktionieren. Ein Eintrag, der ohne Netz ins Leere führt, verschlechtert die Nutzererfahrung. Chrome kann solche Einträge außerdem ausblenden.
- Icons werden beim Aufruf geladen. Eine Icon-Adresse, die nicht erreichbar ist, lässt das Promise scheitern.
- Dieselbe
idnoch einmal zu verwenden, überschreibt den alten Eintrag. Das ist praktisch für Aktualisierungen.