记一次痛苦的Debug: Hexo 卸载 PWA 后无法改动网站 [Service Worker]
最初,我想为 blog 添加 PWA,经过漫长的 ChatGPT4,设置了 manifest.json,编写了 sw.js。但那是,我并没有十分清楚 PWA 的工作原理。
后来,心中仍存迷惑的我删除了 manifest.json 和 sw.js,然后我就发现,无论如何修改,提交到 Vercel 后都不会变化……
原理简析
sw.js 是负责控制缓存的,一旦删除,将被视作离线模式,所有已缓存的数据都会永久保留,而这也就是悲剧的开始。
正确的做法
不要删除 sw.js,通过合理的缓存设置,可以让你的网站访问速度提高一个档次,从而缓解 Vercel 带来的不好的体验。以下是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| const version = 'offline-cache-v3'
self.addEventListener('install', function (event) { event.waitUntil(self.skipWaiting()); });
self.addEventListener('activate', function (event) { event.waitUntil( Promise.all([ self.clients.claim(), caches.keys().then(function (cacheList) { return Promise.all( cacheList.map(function (cacheName) { if (cacheName !== version) { return caches.delete(cacheName); } }) ); }) ]) ); });
function isUrlStartingWithFourDigitFolder(url) { const regex = /^\/\d{4}\//;
const pathname = new URL(url).pathname;
return regex.test(pathname); }
self.addEventListener('fetch', function (event) { if (event.request.url === '/index.html' || event.request.url === '/' || isUrlStartingWithFourDigitFolder(event.request.url) || event.request.url.includes('/archives/') || event.request.url.includes('/categories/') || event.request.url.includes('/tags/') ) { return fetch(event.request); }
event.respondWith( caches.match(event.request).then(function (response) { if (response) { return response; }
var request = event.request.clone(); return fetch(request).then(function (httpRes) { if (!httpRes || httpRes.status !== 200) { return httpRes; }
var responseClone = httpRes.clone(); caches.open(version).then(function (cache) { cache.put(event.request, responseClone); });
return httpRes; }); }) ); })
|