#caching #progressive-web-apps #service-worker
#кэширование #progressive-веб-приложения #service-worker
Вопрос:
Я новичок в PWA и тренируюсь над простым проектом. После первого запуска в goole Chrome, для которого все работало нормально, я изменил cacheName const в service worker и заголовок в index.html чтобы протестировать повторное кэширование всех ресурсов сайта. С этого момента кэш все еще создается, но он пуст, и я получаю сообщение об ошибке «Uncaught (в обещании) Ошибка типа: запрос не удался» ссылается на строку SW, в которой мы объявляем const staticCacheName = ‘site-static-v1’.
Вот код SW:
const staticCacheName = 'site-static-v2';
const assets = [
'./',
'./index.html',
'./index.js',
'./main.js',
'./style.css',
'https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/css/ol.css',
'https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/build/ol.js',
'https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4.js',
'https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4-src.js'
];
// install service worker
self.addEventListener('install', evt => {
console.log('service worker has been installed');
evt.waitUntil(
caches.open(staticCacheName).then(cache => {
console.log('caching shell assets');
cache.addAll(assets);
})
);
});
// activate event
self.addEventListener('activate', evt => {
console.log('service worker has been activated');
});
// fetch event
self.addEventListener('fetch', evt => {
evt.respondWith(
caches.match(evt.request).then(cacheRes => {
return cacheRes || fetch(evt.request);
})
);
});
Любая помощь будет высоко оценена.
Комментарии:
1. скорее всего, один из файлов, которые вы пытаетесь предварительно кэшировать, не разрешен, т.е. 404. Добавьте .catch к вашему вызову addAll, чтобы посмотреть, сможете ли вы определить, какой именно. подсказка, если какой-либо из URL-адресов завершается ошибкой в addAll, то все они завершаются неудачей. Вот почему я прекратил использовать его некоторое время назад и начал использовать cache.put в цикле.
Ответ №1:
Проблема в вашем массиве активов. Требуется только URLpath к файлу, который будет кэшироваться, а не путь к файлу. В двух словах, удалите точки с начала этих путей.
const assets = [
'/',
'/index.html',
'/index.js',
'/main.js',
'/style.css',
'https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/css/ol.css',
'https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/build/ol.js',
'https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4.js',
'https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4-src.js'
];
И если вы храните файлы js и css в статической папке с /static в качестве маршрута, тогда вам нужно добавить /static перед каждым файлом, который в нем присутствует.
Снова я хочу упомянуть, что он принимает только URLpath, а не FILEpath. Он не имеет ничего общего с вашим путем к файлу. Основная причина в том, что на самом деле он кэширует ресурсы с сервера, а не с вашего компьютера. Таким образом, ему нужен маршрут, а не путь к файлу.
Комментарии:
1.Снова я хочу упомянуть, что он принимает только URLpath, а не FILEpath. Он не имеет ничего общего с вашим путем к файлу. Основная причина в том, что на самом деле он кэширует ресурсы с сервера, а не с вашего компьютера. Таким образом, ему нужен маршрут, а не путь к файлу.