118 lines
3.0 KiB
JavaScript
118 lines
3.0 KiB
JavaScript
/**
|
||
* KGV PWA – Service Worker
|
||
*
|
||
* Strategie:
|
||
* - HTML-Seiten: Network-first (frische Inhalte, Fallback auf Cache)
|
||
* - Statische Assets (CSS/JS/Bilder/Fonts): Cache-first
|
||
*/
|
||
|
||
'use strict';
|
||
|
||
const CACHE_NAME = 'kgv-pwa-v1-0-1';
|
||
const OFFLINE_PAGE = '/';
|
||
|
||
const PRECACHE_URLS = [
|
||
'/',
|
||
];
|
||
|
||
// -----------------------------------------------------------------------
|
||
// Install: Precache-Ressourcen laden
|
||
// -----------------------------------------------------------------------
|
||
self.addEventListener( 'install', function ( event ) {
|
||
event.waitUntil(
|
||
caches.open( CACHE_NAME ).then( function ( cache ) {
|
||
return cache.addAll( PRECACHE_URLS );
|
||
} )
|
||
);
|
||
self.skipWaiting();
|
||
} );
|
||
|
||
// -----------------------------------------------------------------------
|
||
// Activate: Alte Caches löschen
|
||
// -----------------------------------------------------------------------
|
||
self.addEventListener( 'activate', function ( event ) {
|
||
event.waitUntil(
|
||
caches.keys().then( function ( keys ) {
|
||
return Promise.all(
|
||
keys
|
||
.filter( function ( key ) { return key !== CACHE_NAME; } )
|
||
.map( function ( key ) { return caches.delete( key ); } )
|
||
);
|
||
} )
|
||
);
|
||
self.clients.claim();
|
||
} );
|
||
|
||
// -----------------------------------------------------------------------
|
||
// Fetch: Anfragen abfangen
|
||
// -----------------------------------------------------------------------
|
||
self.addEventListener( 'fetch', function ( event ) {
|
||
var request = event.request;
|
||
|
||
// Nur GET-Anfragen behandeln
|
||
if ( request.method !== 'GET' ) {
|
||
return;
|
||
}
|
||
|
||
// Nur Anfragen gleichen Ursprungs behandeln
|
||
if ( ! request.url.startsWith( self.location.origin ) ) {
|
||
return;
|
||
}
|
||
|
||
var url = new URL( request.url );
|
||
|
||
// Admin-Bereich und WP-Cron ausschließen
|
||
if (
|
||
url.pathname.startsWith( '/wp-admin' ) ||
|
||
url.pathname.startsWith( '/wp-cron' ) ||
|
||
url.pathname.includes( 'wp-login' )
|
||
) {
|
||
return;
|
||
}
|
||
|
||
// HTML-Navigation: Network-first
|
||
if ( request.mode === 'navigate' ) {
|
||
event.respondWith(
|
||
fetch( request )
|
||
.then( function ( response ) {
|
||
// Erfolgreiche Antwort im Cache speichern
|
||
if ( response && response.status === 200 ) {
|
||
var clone = response.clone();
|
||
caches.open( CACHE_NAME ).then( function ( cache ) {
|
||
cache.put( request, clone );
|
||
} );
|
||
}
|
||
return response;
|
||
} )
|
||
.catch( function () {
|
||
// Offline-Fallback: gecachte Startseite
|
||
return caches.match( request ).then( function ( cached ) {
|
||
return cached || caches.match( OFFLINE_PAGE );
|
||
} );
|
||
} )
|
||
);
|
||
return;
|
||
}
|
||
|
||
// Statische Assets: Cache-first
|
||
if ( /\.(css|js|png|jpg|jpeg|gif|svg|webp|woff2?|ttf|eot|ico)(\?.*)?$/.test( url.pathname ) ) {
|
||
event.respondWith(
|
||
caches.match( request ).then( function ( cached ) {
|
||
if ( cached ) {
|
||
return cached;
|
||
}
|
||
return fetch( request ).then( function ( response ) {
|
||
if ( response && response.status === 200 ) {
|
||
var clone = response.clone();
|
||
caches.open( CACHE_NAME ).then( function ( cache ) {
|
||
cache.put( request, clone );
|
||
} );
|
||
}
|
||
return response;
|
||
} );
|
||
} )
|
||
);
|
||
return;
|
||
}
|
||
} );
|