// наименование для нашего хранилища кэша
const CACHE_NAME = 'app_serviceworker_v_1',
// ссылки на кэшируемые файлы и страницы
cacheUrls = [
'/ru',
'/en',
'/css/style.css',
'/js/script.js'
]
// период обновления кэша - минута
const MAX_AGE = 60
self.addEventListener('install', (event) => {
// задержим обработку события
// если произойдёт ошибка, serviceWorker не установится
event.waitUntil(
// находим в глобальном хранилище Cache-объект с нашим именем
// если такого не существует, то он будет создан
caches.open(CACHE_NAME).then((cache) => {
// загружаем в наш cache необходимые файлы
return cache.addAll(cacheUrls)
})
)
})
self.addEventListener('fetch', (event) => {
event.respondWith(
// ищем запрошенный ресурс среди закэшированных
caches.match(event.request).then((cachedResponse) => {
let
lastModified,
fetchRequest
// если ресурс есть в кэше
if (cachedResponse) {
// получаем дату последнего обновления
lastModified = new Date(cachedResponse.headers.get('last-modified'))
// и если мы считаем ресурс устаревшим
if (lastModified && (Date.now() - lastModified.getTime()) > MAX_AGE) {
fetchRequest = event.request.clone()
// создаём новый запрос
return fetch(fetchRequest).then((response) => {
const responseClone = response.clone()
// при неудаче всегда можно выдать ресурс из кэша
if (!response || response.status !== 200) {
return cachedResponse
} else {
// обновляем кэш
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseClone)
})
// возвращаем свежий ресурс
return response
}
}).catch(() => cachedResponse)
}
return cachedResponse
}
// запрашиваем из сети как обычно
return fetch(event.request)
})
)
})
为此,您需要使用ServiceWorker。您还需要通过 HTTPS 公开您的站点 - Service Worker 出于安全原因需要这样做。
以下是我之前为其中一个项目编写的带有注释的代码示例: