#javascript #caching #service-worker #progressive-web-apps
#javascript #кэширование #service-worker #progressive-веб-приложения
Вопрос:
Я разрабатываю прогрессивное веб-приложение с намерением кэшировать все ресурсы для использования в автономном режиме. Вот мой service worker
self.addEventListener('install', function(e) {
e.waitUntil(
caches.open('default-cache').then(function(cache) {
return cache.addAll([
'/',
'/index.html',
'/bundle.js',
'/libraries/p5.dom.min.js',
'/libraries/p5.min.js',
'/libraries/p5.sound.min.js',
'/sound/spokesm4v.mp3',
'/css/flexboxgrid.min.css',
'/images/icon-192.png',
'/manifest.json',
])
}).then(function() {
return self.skipWaiting();
}));
});
self.addEventListener('activate', function(e) {
e.waitUntil(self.clients.claim());
});
self.addEventListener('fetch', function(e) {
e.respondWith(
caches.match(e.request).then(function(response) {
return response || fetch(e.request);
})
);
});
Независимо от того, подключен я к Сети или нет, работнику службы не удается кэшировать некоторые ресурсы (в данном случае bundle.js ) и нарушает работу моей системы, основанной на кешировании, даже несмотря на то, что я регистрирую сообщение об успешном завершении после регистрации worker.
Комментарии:
1. Как и в justmarkup, я не получаю никакой ошибки: (Однако после возврата вам не хватает точки с запятой
cache.addAll
. Кроме того, регистрация и установка service worker выполняются отдельно, поэтому сообщение об успешной регистрации не означает, что service worker установил и кэшировал ресурсы. Просто К вашему сведению.2. В каких браузерах вы тестируете?
3. Я тестирую на настольном компьютере и мобильном Chrome
Ответ №1:
Я не вижу проблемы, из-за которой происходит сбой кэширования bundle.js но при открытии coloursel.io Я вижу в консоли, что в вашем sw.js «Неперехваченная ошибка ссылки: событие не определено в sw.js:27»
Если вы измените
self.addEventListener('fetch', function(e) {
e.respondWith(
caches.match(event.request).then(function(response) {
return response || fetch(event.request);
})
);
});
Для
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).then(function(response) {
return response || fetch(event.request);
})
);
});
работник службы должен работать так, как ожидалось.
Комментарии:
1. Отличная уловка, но я пытался решить свою проблему, изменив параметры, вокруг которых вы и видели. Думаю, я забыл изменить его обратно. Основная проблема с кэшированием пакета возникает, вероятно, один раз из каждых десяти или около того переходов на страницу, и воспроизвести причину чрезвычайно сложно. Здорово, что он кэшировался для вас, но это означает, что вы являетесь одним из счастливых случаев, когда это разрешается.
Ответ №2:
Попробуйте использовать sw-precache, должно быть проще
Комментарии:
1. Предложение библиотеки — это прекрасно, но это единственное, что в ответе вообще не отвечает на вопрос OP.