Tôi có nhân viên dịch vụ được cài đặt trong trang web của mình, mọi thứ đều hoạt động tốt, ngoại trừ khi tôi cập nhật các tệp được lưu trong bộ nhớ cache, trên thực tế; họ ở lại đánh bắt mãi mãi và tôi dường như không thể làm mất hiệu lực bộ nhớ cache, trừ khi tôi bỏ đăng ký người lao động từ 'chrome: // ServiceWorker-internals/Nhân viên dịch vụ không cập nhật
const STATIC_CACHE_NAME = 'static-cache-v1';
const APP_CACHE_NAME = 'app-cache-#VERSION';
const CACHE_APP = [
'/',
'/app/app.js'
]
const CACHE_STATIC = [
'https://fonts.googleapis.com/css?family=Roboto:400,300,500,700',
'https://cdnjs.cloudflare.com/ajax/libs/normalize/4.1.1/normalize.min.css'
]
self.addEventListener('install',function(e){
e.waitUntil(
Promise.all([caches.open(STATIC_CACHE_NAME),caches.open(APP_CACHE_NAME)]).then(function(storage){
var static_cache = storage[0];
var app_cache = storage[1];
return Promise.all([static_cache.addAll(CACHE_STATIC),app_cache.addAll(CACHE_APP)]);
})
);
});
self.addEventListener('activate', function(e) {
e.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheName !== APP_CACHE_NAME && cacheName !== STATIC_CACHE_NAME) {
console.log('deleting',cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});
self.addEventListener('fetch',function(e){
const url = new URL(e.request.url);
if (url.hostname === 'static.mysite.co' || url.hostname === 'cdnjs.cloudflare.com' || url.hostname === 'fonts.googleapis.com'){
e.respondWith(
caches.match(e.request).then(function(response){
if (response) {
return response;
}
var fetchRequest = e.request.clone();
return fetch(fetchRequest).then(function(response) {
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
var responseToCache = response.clone();
caches.open(STATIC_CACHE_NAME).then(function(cache) {
cache.put(e.request, responseToCache);
});
return response;
});
})
);
} else if (CACHE_APP.indexOf(url.pathname) !== -1){
e.respondWith(caches.match(e.request));
}
});
nơi #VERSION là một phiên bản được gắn vào tên bộ nhớ cache tại thời gian biên dịch; lưu ý rằng STATIC_CACHE_NAME không bao giờ thay đổi vì các tệp được cho là tĩnh mãi mãi.
Ngoài ra, hành vi này là thất thường, tôi đã kiểm tra chức năng xóa (phần mà nó đăng nhập) và nó vẫn ghi nhật ký về xóa bộ nhớ cache đã bị xóa (được cho là). khi tôi chạy caches.keys().then(function(k){console.log(k)})
tôi nhận được toàn bộ các bộ nhớ cache cũ cần được xóa.
Hãy nhớ rằng bạn có thể sử dụng 'self.skipWaiting()' bên ngoài lời hứa. – Salva