app / service-worker.js
Kgshop's picture
Update service-worker.js
28b130d verified
const CACHE_NAME = 'teplostil-cache-v5'; // Обновляем версию кэша
const URLS_TO_CACHE = [
'/',
'/index.html',
'/style.css',
'/icon.png',
'/icon-512x512.png',
'/manifest.json'
];
// Установка Service Worker и кэширование ресурсов
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
console.log('Opened cache');
return cache.addAll(URLS_TO_CACHE);
})
);
self.skipWaiting();
});
// Активация и удаление старых кэшей
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log('Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
self.clients.claim();
});
// Обработка запросов
self.addEventListener('fetch', (event) => {
const requestUrl = new URL(event.request.url);
// Пропускаем запросы к внешнему iframe. Кэшируем их стандартным образом браузера.
if (requestUrl.origin !== self.location.origin) {
console.log('Пропускаем внешний запрос (не кэшируем через SW):', requestUrl.href);
// Используем стандартный fetch, не вмешиваясь. Браузер сам разберется с кэшированием.
return;
}
// Для навигационных запросов (это запросы к index.html)
if (event.request.mode === 'navigate') {
event.respondWith(
caches.match('/index.html').then((response) => {
return response || fetch(event.request);
})
);
} else {
// Для локальных ресурсов используем Cache First
event.respondWith(
caches.match(event.request).then((response) => {
// Возвращаем кэшированный ресурс, если есть.
if (response) {
return response;
}
// Если ресурса нет в кэше, делаем сетевой запрос.
return fetch(event.request).then((networkResponse) => {
// Если запрос с нашего origin, кэшируем ответ.
if (requestUrl.origin === self.location.origin) {
return caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
}
// Если запрос не с нашего origin, просто возвращаем ответ (не кэшируем в SW).
return networkResponse;
});
}).catch(error => {
// Обработка ошибок, если и кэш недоступен, и сеть.
console.error("Fetch failed:", error);
// Можно вернуть страницу-заглушку об ошибке.
return new Response('<h1>Offline</h1><p>Sorry, the content is not available offline.</p>', {
headers: { 'Content-Type': 'text/html' }
});
})
);
}
});