一、注册与更新if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js').then(reg => {
if (reg.waiting) reg.waiting.postMessage({ type: 'SKIP_WAITING' })
reg.addEventListener('updatefound', () => {
const worker = reg.installing
if (worker) worker.addEventListener('statechange', () => {
if (worker.state === 'installed' && navigator.serviceWorker.controller) {
worker.postMessage({ type: 'SKIP_WAITING' })
}
})
})
})
})
}
二、SW核心与版本化缓存const VERSION = 'v1.0.0'
const CACHE = 'app-cache-' + VERSION
self.addEventListener('install', (event: any) => {
;(self as any).skipWaiting()
event.waitUntil(caches.open(CACHE).then(cache => cache.addAll(['/','/index.html','/app.css','/app.js'])))
})
self.addEventListener('activate', (event: any) => {
event.waitUntil(caches.keys().then(keys => Promise.all(keys.filter(k => !k.endsWith(VERSION)).map(k => caches.delete(k)))).then(() => (self as any).clients.claim()))
})
self.addEventListener('message', (event: any) => {
if (event.data?.type === 'SKIP_WAITING') (self as any).skipWaiting()
})
self.addEventListener('fetch', (event: any) => {
const req = event.request
event.respondWith(caches.match(req).then(r => r || fetch(req)))
})
三、回退与安全async function safeFetch(req: Request): Promise<Response> {
try { return await fetch(req) } catch { return new Response('offline', { status: 503 }) }
}
四、验收清单注册与更新流程包含`skipWaiting/clientsClaim`;安装阶段预缓存版本化资源。激活时清理旧版本缓存;消息通道触发跳过等待;离线回退响应。资源列表最小化且使用版本化路径;更新发布可控与可回退。

发表评论 取消回复