我有一个简单的服务工作者
self.addEventListener('install', function(event) {
console.log('Service Worker Install...');
// pre cache a load of stuff:
event.waitUntil(
caches.open(CURRENT_CACHES.prefetch)
.then(function(cache) {
return cache.addAll([
'/android-chrome-192x192.png',
'/android-chrome-512x512.png',
'/apple-touch-icon.png',
'/browserconfig.xml',
'/favicon-16x16.png',
'/favicon-32x32.png',
'/favicon.ico',
'/favicon.png',
'/mstile-150x150.png',
'/safari-pinned-tab.svg',
'/app.css',
'/bundle.js',
'/sw.js'
])
.then(function(){
console.log('Caches added');
})
.catch(function(error){
console.error('Error on installing');
console.error(error);
});
})
)
});
self.addEventListener('activate', function(event) {
console.log('Service Worker Activate...');
// Delete all caches that aren't named in CURRENT_CACHES.
var expectedCacheNames = Object.keys(CURRENT_CACHES).map(function(key) {
return CURRENT_CACHES[key];
});
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (expectedCacheNames.indexOf(cacheName) === -1) {
// If this cache name isn't present in the array of "expected" cache names, then delete it.
console.log('Deleting out of date cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});
self.addEventListener('fetch', function(event) {
console.log('Service Worker Fetch...');
event.respondWith(
caches.match(event.request)
.then(function(response) {
if(event.request.url.indexOf('facebook') > -1){
return fetch(event.request);
}
if(response){
console.log('Serve from cache', response);
return response;
}
return fetch(event.request);
})
.catch(function(error){
console.error('Error on fetching');
console.error(error);
})
);
});
虽然这有效,但我在缓存中看到所有内容都正确缓存:
当我关闭网络并刷新时,我得到: 为服务工作者提取脚本时发生了未知错误。。
我不认为服务工作人员已经在那里吗?为什么必须重新获取?
答案 0 :(得分:5)
在安装步骤中,您必须缓存/
和/index.html
,或者您可以在获取请求后缓存请求:
self.addEventListener('fetch', function(event) {
console.log('Service Worker Fetch...');
event.respondWith(
caches.match(event.request)
.then(function(response) {
if(event.request.url.indexOf('facebook') > -1){
return fetch(event.request);
}
if(response){
console.log('Serve from cache', response);
return response;
}
return fetch(event.request)
.then(response =>
caches.open(CURRENT_CACHES.prefetch)
.then((cache) => {
// cache response after making a request
cache.put(event.request, response.clone());
// return original response
return response;
})
)