const CACHE_NAME = 'geovector-v1'; const urlsToCache = [ '/', '/index.html', '/index.css', '/media/geo-logo.webp', '/media/qr-code.png' ]; // Установка Service Worker self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('Кэш открыт'); return cache.addAll(urlsToCache); }) ); self.skipWaiting(); }); // Активация Service Worker self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { console.log('Удаление старого кэша:', cacheName); return caches.delete(cacheName); } }) ); }) ); return self.clients.claim(); }); // Fetch - стратегия Network First, затем Cache self.addEventListener('fetch', (event) => { event.respondWith( fetch(event.request) .then((response) => { // Клонируем ответ, так как можем использовать его только один раз const responseToCache = response.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseToCache); }); return response; }) .catch(() => { // Если сеть недоступна, пытаемся получить из кэша return caches.match(event.request).then((cachedResponse) => { if (cachedResponse) { return cachedResponse; } // Если нет в кэше, возвращаем офлайн-страницу return caches.match('/index.html'); }); }) ); });