【发布时间】:2020-02-16 05:37:27
【问题描述】:
我最近刚刚开始摆弄服务人员,并且遇到一种情况,无论我告诉它添加什么文件到缓存中,它都会添加所有内容。现在,这通常意味着我对离线应用程序的工作更少,但我有点困惑。所以缓存似乎有两种添加请求的方法,.add() 和.addAll(),后者能够接收请求数组,但即使只有.add() 带有硬编码的请求,绝对是所有请求似乎最终在缓存中。
我的代码如下:
if ('serviceWorker' in navigator) {
//console.log('CLIENT: service worker registration in progress.');
navigator.serviceWorker.register('/sw.js').then(function() {
//console.log('CLIENT: service worker registration complete.');
}, function() {
//console.log('CLIENT: service worker registration failure.');
});
} else {
console.log('CLIENT: service worker is not supported.');
}
...这是在调用服务工作者的实际页面中,以及服务工作者本身:
var cacheName = 'cache';
self.addEventListener('install', (e) => {
console.log('[Service Worker] Install');
var appShellFiles = [
];
e.waitUntil(
caches.open(cacheName).then((cache) => {
console.log('[Service Worker] Caching all: app shell and content');
return cache.add('assets/images/boy.svg').then(function() {
// requests have been added to the cache
console.log('added')
});
})
);
});
self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request).then((r) => {
console.log('[Service Worker] Fetching resource: '+e.request.url);
return r || fetch(e.request).then((response) => {
return caches.open(cacheName).then((cache) => {
console.log('[Service Worker] Caching new resource: '+e.request.url);
cache.put(e.request, response.clone());
return response;
});
});
})
);
});
self.addEventListener('activate', (e) => {
e.waitUntil(
caches.keys().then((keyList) => {
return Promise.all(keyList.map((key) => {
if(key !== cacheName) {
return caches.delete(key);
}
}));
})
);
});
...但是这里的.add('assets/images/boy.svg') 曾经是.addAll(appShellFiles),它本身曾经包含单个文件,但似乎忽略了列表并仍然缓存所有内容。我错过了什么?
【问题讨论】: