Spaces:
Running
Running
| 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' } | |
| }); | |
| }) | |
| ); | |
| } | |
| }); |