一、注册与更新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`;安装阶段预缓存版本化资源。激活时清理旧版本缓存;消息通道触发跳过等待;离线回退响应。资源列表最小化且使用版本化路径;更新发布可控与可回退。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部