94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
|
|
|
|
// cache名, 在控制台Application的CaChe下可以看到
|
|
const cacheName = "penueling";
|
|
// cache文件
|
|
const cacheFiles = ["/index.html", "/manifest.json"];
|
|
|
|
var offlineExclude = [
|
|
'/api/',
|
|
];
|
|
|
|
|
|
|
|
self.addEventListener('push', function (event) {
|
|
console.log('[Service Worker] Push Received.');
|
|
console.log(`[Service Worker] Push had this data: "${event.data.text()}"`)
|
|
let data = JSON.parse(event.data.text())
|
|
|
|
const title = data.notification.title || '';
|
|
const options = {
|
|
body: data.notification.body,
|
|
icon: data.notification.image || '',
|
|
badge: data.notification.image || ''
|
|
};
|
|
|
|
event.waitUntil(self.registration.showNotification(title, options));
|
|
});
|
|
self.addEventListener('notificationclick', function (event) {
|
|
console.log('[Service Worker] Notification click Received.');
|
|
|
|
event.notification.close();
|
|
|
|
event.waitUntil(
|
|
clients.openWindow('https://www.18n.com/')
|
|
);
|
|
});
|
|
|
|
/**
|
|
* 安装 Service Worker
|
|
* install事件是 Service Worker 执行的第一个事件,同一个 Service Worker 只会调用一次
|
|
* 即使 Service Worker 脚本文件只有一个字节不同,浏览器也将视为一个新的 Service Worker
|
|
*/
|
|
self.addEventListener("install", e => {
|
|
e.waitUntil(
|
|
caches.open(cacheName).then(cache => {
|
|
return cache.addAll(cacheFiles);
|
|
}),
|
|
);
|
|
});
|
|
|
|
/**
|
|
// * 激活 Service Worker
|
|
// * Service Worker 安装成功之后,会触发activate事件
|
|
// * 在这个阶段我们一般做一些清理旧缓存相关的工作
|
|
// */
|
|
// self.addEventListener("activate", (e) => {
|
|
// // e.waitUntil(caches.delete(cacheName));
|
|
// e.waitUntil(
|
|
// caches
|
|
// .keys()
|
|
// .then((keys) => {
|
|
// return Promise.all(
|
|
// keys.map((key) => {
|
|
// // 清理缓存
|
|
// if (cacheName !== key) {
|
|
// return caches.delete(key);
|
|
// }
|
|
// })
|
|
// );
|
|
// })
|
|
// .then(() => {
|
|
// console.log("cache deleted");
|
|
// })
|
|
// );
|
|
// });
|
|
|
|
self.addEventListener("fetch", e => {
|
|
if (e.request.cache === 'only-if-cached' && e.request.mode !== 'same-origin') {
|
|
return false
|
|
}
|
|
for (let i = 0; i < offlineExclude.length; i++) {
|
|
if (e.request.url.indexOf(offlineExclude[i]) !== -1) return false;
|
|
}
|
|
var u = e.request.url.replace('https://', '')
|
|
|
|
|
|
var n = u.indexOf('/')
|
|
if (u.slice(n, 60).indexOf('.') == -1) {
|
|
return false;
|
|
}
|
|
e.respondWith(
|
|
caches.match(e.request).then((response) => response || fetch(e.request)),
|
|
);
|
|
}); |