내가에 댓글을 무엇의 예입니다
페이지 스크립트 :
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)
,[]
)
)
);
}
}
);
출처
2017-10-23 10:33:34
HMR
나는 내가 원하는 것을하지 않는 것을 시도해 보았다.['window.location.reload (true)'] (https://developer.mozilla.org/en-US/docs/Web/API/Location/reload) ('forcedRefresh' 매개 변수)는 일반적으로 다음과 같이 가정됩니다. shift-refresh와 동일하지만, 내 테스트에서'location.reload (true)'는 SW를 무시/무시하지 않는다; SW에 관한 한, location.reload (false)와 같다. (Chrome의 버그입니까?) –
모든 캐시를 삭제하려면 'caches.delete'를 사용할 수 있습니다. https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers# Deleting_old_caches js 코드 (버튼 클릭 핸들러)에서 작동하는 서비스와 통신 할 수 있고 서비스 작업자 메시지 핸들러가 캐시를 삭제할 수 있습니다 (또는 일부만 삭제할 수 있음). 서비스 작업자가 완료되면 페이지를 다시로드하십시오. http://craig-russell.co.uk/2016/01/29/service-worker-messaging.html#.We2hlHWCzHQ – HMR