html Service Worker缓存

2026-04-24 11:00:10 1679阅读 0评论

用 Service Worker 缓存打造更稳的离线体验

在移动端,用户从加载页面到数据可用,常经历几秒钟的空窗;在弱网或设备刚上线时,这空窗更像“断点”。用 Service Worker 做本地缓存,能减少对网络的依赖,让内容在“可用但不完美”的状态提前呈现,既提升感知速度,也提升容错能力。

从“等资源”到“可用即缓存”

你不必等所有资源下载完成就让用户看到内容。通过在 install 阶段预先缓存关键资源,并在 fetch 时优先返回缓存,页面能更早可用。像文章、图片、样式与脚本,甚至部分 API 响应,都能被纳入缓存策略,具体选择看你的场景与优先级。

核心做法:在 install 时只缓存需要的资源,避免体积过大;在 fetch 时用缓存优先,网络仅作备选(Cache-First)。

缓存策略与缓存寿命:精细控场

“缓存多久?”“缓存什么?”这两件事决定策略的成败。

  • 缓存范围:按资源类型划分缓存桶,如 html、images、fonts、css、scripts、api-responses,分别设置独立的缓存策略与寿命。
  • 缓存寿命:对 api 响应可以设定较短的 TTL(如 5–15 分钟),图片与静态内容可设更长的(如 24 小时),并在页面隐藏或用户主动刷新时触发更新。
  • 更新机制:在 Service Worker 生命周期内定期检查更新,或在特定事件(如 push、用户点击)触发更新,保证缓存与服务器数据的同步。

实战:从配置到生效的最小可运行例子

// sw.js
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('my-cache-v1').then(cache => {
      return cache.addAll([
        '/', '/style.css', '/main.js', '/images/logo.png',
        '/api/data?version=1', '/api/data?version=2'
      ]);
    })
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.open('my-cache-v1').then(cache => {
      return cache.match(event.request).then(response => {
        if (response) {
          return response;
        }
        return caches.open('my-cache-v1').then(cache => {
          return fetch(event.request).then(fetchResponse => {
            if (fetchResponse && fetchResponse.ok) {
              return cache.put(event.request, fetchResponse.clone());
            }
            return response;
          });
        });
      });
    })
  );
});

这段代码实现了“先用缓存、再用网络”的逻辑,并在首次请求后把匹配资源写入缓存,为后续请求提供更顺畅的体验。

从缓存到容错:错误处理与降级

当网络波动或请求失败时,能提供降级体验至关重要。Service Worker 可以在 fetch 失败时返回缓存版本,或在某些资源缺失时提供占位内容与提示,减少失败对体验的冲击。

关键点:在 fetch 时设置网络请求的超时与重试策略,失败时返回缓存或降级内容,让用户在“可用但有限”的状态下继续操作。

何时缓存,何时不缓存

不是所有内容都适合缓存。图片、字体、部分 HTML 适合缓存;而一些需要实时更新的 API、涉及敏感数据的请求、或明确要求“不缓存”的资源(Cache-Control: no-store)应排除在缓存策略之外,避免数据不一致。

可维护性:缓存版本与回退

随着页面和依赖资源更新,缓存版本也需要同步更新。引入版本化的缓存名称(如 cache-v1、cache-v2)并在更新时触发清理与重建,既保证体验的连贯性,也便于回滚与排障。

结尾

用 Service Worker 做缓存,不是为了“无损无痕”的完美离线,而是让用户在不稳定的网络下也能尽快看到可用内容,并在需要时再补全细节。结合合理的缓存范围、寿命与更新策略,你就能在不增加复杂度的前提下,提升页面的稳定性与速度,减少“加载中”的等待,让每一次访问都更安心。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
验证码
评论列表 (暂无评论,1679人围观)

还没有评论,来说两句吧...

目录[+]