服务人员可能会干扰刷新按钮(按设计)。在桌面Chrome上,您可以按住shift并单击刷新按钮进行硬重新加载,忽略任何已安装的ServiceWorker。
有没有办法在JavaScript中强制重新加载忽略SW?
(我想这样,所以如果SW开始行为不端,我可以给移动用户一个推按钮。手机没有移位键。)
答案 0 :(得分:6)
如果在刷新之前unregister
服务工作者,则下载页面加载将在没有服务工作者的情况下加载。
navigator.serviceWorker.getRegistration().then(function(reg) {
if (reg) {
reg.unregister().then(function() { window.location.reload(true); });
} else {
window.location.reload(true);
}
});
答案 1 :(得分:0)
以下是我评论过的一个例子:
页面脚本:
if('serviceWorker' in navigator){
// Register service worker
navigator.serviceWorker.register('/service-worker.js')
.then(
reg =>
console.log("SW registration succeeded. Scope is "+reg.scope)
,err =>
console.error("SW registration failed with error "+err)
);
}
const send_message_to_sw = (msg) =>
new Promise(
(resolve, reject) => {
// Create a Message Channel
const msg_chan = new MessageChannel();
// Handler for recieving message reply from service worker
msg_chan.port1.onmessage = (event) => {
if(event.data.error){
reject(event.data.error);
}else{
resolve(event.data);
}
};
// Send message to service worker along with port for reply
navigator.serviceWorker.controller.postMessage(
msg
, [msg_chan.port2]
);
}
);
document.body.addEventListener(
"click"
,()=>
send_message_to_sw(
{
action:"delete"
,cache:/^v1$/
,url:/.*bundle.js$/
}
)
.then(
(msg)=>
console.log("deleted:",msg)
)
);
服务人员:
console.log("SW Startup!");
// Install Service Worker
self.addEventListener(
'install'
,(event)=>
console.log('installed!')
);
// Service Worker Active
self.addEventListener(
'activate'
,(event)=>
console.log('activated!')
);
self.addEventListener(
'fetch'
,(event) =>
event.respondWith(
caches.match(event.request)
.then((resp) =>
resp
||
fetch(event.request)
.then(
(response) =>
caches.open('v1')
.then(
(cache) => {
cache.put(event.request, response.clone());
return response;
}
)
)
)
)
);
self.addEventListener(
'message'
,(event) =>{
const data = event.data || {};
if(data.action === "delete"){
var p =
caches.keys()
.then(
(keyList) =>
keyList
.filter(
key=>data.cache.test(key)
)
)
;
if(data.url === undefined) {
p = p.then(
(keyList) =>
Promise.all(
keyList
.map((key) =>{
caches.delete(key);
return key;
}
)
)
)
}else {
p = p.then(
(keyList) =>
Promise.all(
keyList
.map((key) =>
caches.open(key)
.then(
(cache)=>
Promise.all([
cache
,cache.keys()
])
)
.then(
([cache,items])=>
Promise.all(
items
.filter(item=>data.url.test(item.url))
.map(
item=>{
cache.delete(item);
return key + ":" + item.url
}
)
)
)
)
)
)
}
return p.then(
(keys)=>
event.ports[0].postMessage(
keys
.reduce(
(acc,item)=>acc.concat(item)
,[]
)
)
);
}
}
);