2023-02-06 12:48:00
Service Worker 是提升 Web 前端性能的重要技术,通过缓存策略可显著优化页面加载速度。以下是对代码的解析及优化建议:
核心功能解析注册 Service Worker在主线程中检测浏览器支持后注册 sw.js,控制台输出注册状态:
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(...).catch(...);}缓存静态资源(install 阶段)预缓存关键 JS/CSS/图片等资源,避免重复请求:
const CACHE_NAME = 'lcget-com-cache';self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME).then(cache => cache.addAll([...资源URL列表...]) ) );});拦截请求并返回缓存(fetch 阶段)优先返回缓存内容,未命中时请求网络并更新缓存:
self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request).then(response => { if (response) return response; // 命中缓存 return fetch(event.request).then(response => { if (response.ok && event.request.method === 'GET') { const newResponse = response.clone(); caches.open(CACHE_NAME).then(cache => cache.put(event.request, newResponse)); } return response; }); }) );});清理旧缓存(activate 阶段)激活时删除旧版本缓存(当前代码逻辑有误,见下文优化建议):
self.addEventListener('桐帆裤activate', event => { event.waitUntil( caches.keys().then(keys => Promise.all(keys.map(cache => { if (cache === CACHE_NAME) return caches.delete(cache); // 错误:应删除旧缓存 })) ) );});修复缓存清理逻辑当前代码会误删当前缓存,应改为保留局简最新缓存:轿颤
self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(keys => Promise.all(keys.map(cache => { if (cache !== CACHE_NAME) return caches.delete(cache); // 删除非当前缓存 })) ) );});动态缓存策略优化
限制缓存大小,避免无限增长:
const MAX_CACHE_SIZE = 50; // 最大缓存条目数caches.open(CACHE_NAME).then(cache => { cache.keys().then(keys => { if (keys.length > MAX_CACHE_SIZE) { cache.delete(keys[0]).then(() => cache.put(event.request, newResponse)); } });});对 API 响应等动态内容设置短缓存时间。
离线页面支持添加离线兜底页面:
self.addEventListener('fetch', event => { if (event.request.mode === 'navigate') { event.respondWith( fetch(event.request).catch(() => caches.match('/offline.html')) ); }});版本控制通过修改 CACHE_NAME(如 'lcget-com-cache-v2')强制更新缓存。
通过以上优化,可实现更稳定、高效的缓存策略,显著提升网站性能评分。