// sw.js - Service Worker const CACHE_NAME = 'meu-blog-cache-v1'; const CACHE_DURATION = 7 * 24 * 60 * 60 * 1000; // 7 dias em ms // Recursos para pré-cachear const PRECACHE_URLS = [ '/', '/p/sobre.html', // adicione suas páginas importantes ]; // INSTALAÇÃO - pré-cacheia recursos essenciais self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => { console.log('Cache aberto'); return cache.addAll(PRECACHE_URLS); }) ); self.skipWaiting(); }); // ATIVAÇÃO - limpa caches antigos self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames .filter((name) => name !== CACHE_NAME) .map((name) => caches.delete(name)) ); }) ); self.clients.claim(); }); // FETCH - estratégia "Stale While Revalidate" self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request).then((cachedResponse) => { // Busca atualização em segundo plano const fetchPromise = fetch(event.request).then((networkResponse) => { // Só cacheia respostas válidas if (networkResponse && networkResponse.status === 200) { const responseClone = networkResponse.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseClone); }); } return networkResponse; }).catch(() => { // Offline: retorna página offline se disponível return cachedResponse; }); // Retorna cache IMEDIATAMENTE, atualiza depois return cachedResponse || fetchPromise; }) ); });

Comentários