// 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)), ); });