// 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
Postar um comentário