web前端优化:使用serviceWorker,让网站秒开,大大提升性能

web前端优化:使用serviceWorker,让网站秒开,大大提升性能
最新回答
伤丶始终落疤

2023-02-06 12:48:00

Service Worker 是提升 Web 前端性能的重要技术,通过缓存策略可显著优化页面加载速度。以下是对代码的解析及优化建议:

核心功能解析
  1. 注册 Service Worker在主线程中检测浏览器支持后注册 sw.js,控制台输出注册状态:

    if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(...).catch(...);}
  2. 缓存静态资源(install 阶段)预缓存关键 JS/CSS/图片等资源,避免重复请求:

    const CACHE_NAME = 'lcget-com-cache';self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME).then(cache => cache.addAll([...资源URL列表...]) ) );});
  3. 拦截请求并返回缓存(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; }); }) );});
  4. 清理旧缓存(activate 阶段)激活时删除旧版本缓存(当前代码逻辑有误,见下文优化建议):

    self.addEventListener('桐帆裤activate', event => { event.waitUntil( caches.keys().then(keys => Promise.all(keys.map(cache => { if (cache === CACHE_NAME) return caches.delete(cache); // 错误:应删除旧缓存 })) ) );});
优化建议
  1. 修复缓存清理逻辑当前代码会误删当前缓存,应改为保留局简最新缓存:轿颤

    self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(keys => Promise.all(keys.map(cache => { if (cache !== CACHE_NAME) return caches.delete(cache); // 删除非当前缓存 })) ) );});
  2. 动态缓存策略优化

    限制缓存大小,避免无限增长:

    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 响应等动态内容设置短缓存时间。

  3. 离线页面支持添加离线兜底页面:

    self.addEventListener('fetch', event => { if (event.request.mode === 'navigate') { event.respondWith( fetch(event.request).catch(() => caches.match('/offline.html')) ); }});
  4. 版本控制通过修改 CACHE_NAME(如 'lcget-com-cache-v2')强制更新缓存。

性能提升原理
  • 首次加载:预缓存关键资源,减少网络请求时间。
  • 二次加载:直接从缓存读取,实现“秒开”效果。
  • LCP 优化:核心资源(如首屏图片、CSS)缓存后加载速度提升 50%(如案例所示)。
注意事项
  1. HTTPS 限制:Service Worker 仅在 HTTPS 或 localhost 环境下生效。
  2. 缓存更新:修改资源后需更新 CACHE_NAME 或调用 cache.delete()。
  3. 调试工具:使用 Chrome DevTools 的 Application > Service Workers 面板监控状态。
完整优化代码示例// sw.jsconst CACHE_NAME = 'lcget-com-cache-v2';const ASSETS = [ '
https://www.lcget.com/public3/lcget/js/fl.js'
, // ...其他资源];self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS)) );});self.addEventListener('fetch', event => { if (event.request.method !== 'GET') return; event.respondWith( caches.match(event.request).then(cached => { if (cached) return cached; return fetch(event.request).then(response => { if (!response.ok) return response; const clone = response.clone(); caches.open(CACHE_NAME).then(cache => cache.put(event.request, clone)); return response; }); }) );});self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(keys => Promise.all(keys.map(key => key !== CACHE_NAME ? caches.delete(key) : Promise.resolve() )) ) );});

通过以上优化,可实现更稳定、高效的缓存策略,显著提升网站性能评分。