javascript - ServiceWorker 不更新缓存
问题描述
我正在尝试安装一个ServiceWorker
,每次更改当前使用的缓存版本时都会清除缓存。
我已经index.html
缓存在v0.0.1
缓存中,如果缓存版本更改为v0.0.2
或其他任何内容,则应重新下载index.html
.
我加载我ServiceWorker
的:
if('serviceWorker' in navigator){
navigator.serviceWorker
.register('serviceWorker.js')
.then(() => {
console.log('Service Worker Registered');
});
}
这是:
serviceWorker.js
const currentVersion = 'v0.0.1';
self.addEventListener('install', e => {
e.waitUntil(
caches.open(currentVersion).then(cache => cache.addAll([
'',
'index.html',
'js/load.min.js',
'lib/db.js/js/db.min.js'
]))
);
});
self.addEventListener('fetch', e => {
e.respondWith(
caches.match(e.request).then(resp => {
return resp || fetch(e.request).then(response => {
return caches.open(currentVersion).then(cache => {
cache.put(e.request, response.clone());
return response;
});
});
})
);
});
self.addEventListener('activate', e => {
e.waitUntil(
caches.keys().then(keyList =>
Promise.all(keyList.map(key => key != currentVersion ? caches.delete(key) : Promise.resolve()))
)
);
});
但我尝试编辑index.html
和更新serviceWorker
版本,但index.html
文件没有改变。它始终显示第一个版本。
我究竟做错了什么?
解决方案
这里有两个问题。
首先,在fetch
my 事件中ServiceWorker
,我检查了整个缓存是否包含我正在获取的文件,而不是当前的缓存版本。
所以我编辑了我的fetch
事件监听器:
self.addEventListener('fetch', e => {
e.respondWith(
caches.open(currentVersion).then(cache => {
return cache.match(e.request).then(resp => {
// Request found in current cache, or fetch the file
return resp || fetch(e.request).then(response => {
// Cache the newly fetched file for next time
cache.put(e.request, response.clone());
return response;
// Fetch failed, user is offline
}).catch(() => {
// Look in the whole cache to load a fallback version of the file
return caches.match(e.request).then(fallback => {
return fallback;
});
});
});
})
);
});
最后一个问题是简单地重新加载页面 (F5) 并没有改变ServiceWorker
.
为了ServiceWorker
激活新的,您需要关闭选项卡并打开一个新选项卡。
推荐阅读
- android - android 应用程序如何向 Web 服务器证明其身份?
- c - 将限制指针分配给非限制指针的语义是什么?
- python - python中的会话管理
- c# - 在控制台应用程序中调用 Azure AD Web API 方法时出现 401 错误
- groovy - 我如何创建一个包含可以由 JMeter 中的所有线程更新的同步列表的属性?
- r - 平均具有头号名称的选定列
- java - 消费者从 avro 模式读取数据两次
- javascript - 如您所见,我正在尝试创建链接元素?
- node.js - 有没有办法在 TypeORM 中关闭查询参数化?
- mysql-workbench - 为什么我会收到“未处理的异常”?