所以,我有一个带有服务工作者的HTML页面, 服务工作者缓存index.html和我的JS文件。
问题是当我更改JS时,更改不会直接显示在客户端浏览器上。当然在chrome dev-tools中,我可以禁用缓存。但在Chrome手机中,我该怎么做?
我尝试访问网站设置并点击CLEAR%RESET按钮。 但它仍然从缓存加载旧页面/加载。 我尝试使用其他浏览器或Chrome隐身,它会加载新页面。
然后,我尝试清除我的浏览数据(只是缓存)并且它有效。
我想这不是它应该如何正常工作?我的用户在不清除Chrome浏览器缓存的情况下不知道页面是否更新。
答案 0 :(得分:49)
如果您知道缓存名称,只需在工作人员的任何地方拨打caches.delete()
即可:
caches.delete(/*name*/);
如果您想要擦除所有缓存(而不是等待它们,请说这是后台任务),您只需要add this:
caches.keys().then(function(names) {
for (let name of names)
caches.delete(name);
});
答案 1 :(得分:15)
使用它来删除过时的缓存:
self.addEventListener('activate', function(event) {
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.filter(function(cacheName) {
// Return true if you want to remove this cache,
// but remember that caches are shared across
// the whole origin
}).map(function(cacheName) {
return caches.delete(cacheName);
})
);
})
);
});
答案 2 :(得分:5)
通常,您更新服务工作者JS文件中的CACHE_NAME
,以便您的工作者再次安装:
self.addEventListener('install', evt => {
evt.waitUntil(
caches.open(CACHE_NAME).then(cache => cache.addAll(inputs))
)
})
或者,清除 PWA的缓存:
self.caches.keys().then(keys => { keys.forEach(key => console.log(key)) })
列出缓存键的名称,然后运行:
self.caches.delete('my-site-cache')
按名称删除缓存键(即my-site-cache)。然后刷新页面。
如果刷新后在控制台中看到任何与工作人员相关的错误,则可能还需要注销注册的工作人员:
navigator.serviceWorker.getRegistrations()
.then(registrations => {
registrations.forEach(registration => {
registration.unregister()
})
})
答案 3 :(得分:1)
这是唯一对我有用的代码。 这是我对Mozilla documentation的改编:
//Delete all caches and keep only one
const cachNameToKeep = 'myCache';
//Deletion should only occur at the activate event
self.addEventListener('activate', event => {
var cacheKeeplist = [cacheName];
event.waitUntil(
caches.keys().then( keyList => {
return Promise.all(keyList.map( key => {
if (cacheKeeplist.indexOf(key) === -1) {
return caches.delete(key);
}
}));
})
.then(self.clients.claim())); //this line is important in some contexts
});
答案 4 :(得分:0)
非常感谢Hashbrown。我使用此方法通过自定义检查系统更新我的应用程序,这一页已对此进行了解释:
答案 5 :(得分:0)
最优雅的解决方案,使用 async/await:
const cacheName = 'v2';
self.addEventListener('activate', event => {
// Remove old caches
event.waitUntil(
(async () => {
const keys = await caches.keys();
return keys.map(async (cache) => {
if(cache !== cacheName) {
console.log('Service Worker: Removing old cache: '+cache);
return await caches.delete(cache);
}
})
})()
)
})