必须分步手动清除:先在about:debugging#/runtime/this-firefox注销Service Worker,再点击“缓存存储”链接逐个删除Cache Storage条目,最后用about:cache搜索并删除磁盘缓存中残留的旧资源。
about:debugging 页面里的 Service Worker 不注销干净,离线资源就一直被旧缓存拦截——哪怕你刷新、硬刷新、清了常规缓存都没用。根本原因是 Service Worker 注册后会持续控制页面生命周期,且其缓存(Cache Storage)和注册状态是分离存储的,必须分步手动清除。
在 about:debugging 中注销 Service Worker 并确认状态
这是最直接、最常被跳过的一步。很多用户只点“Unregister”,却没注意它是否真被移除了:
- 地址栏输入
about:debugging#/runtime/this-firefox(不是旧版about:debugging),确保进入“此 Firefox”运行时 - 等待“Service Workers”列表加载完成,重点看状态列:必须是
Activated或Waiting才能注销;若显示Redundant,说明已失效但未清理,仍需手动点击“Unregister” - 注销后立即刷新目标页面,打开开发者工具 → Application → Service Workers 面板,确认 “No service worker registered” 提示出现
- 如果注销按钮灰掉或点不动,说明该 Service Worker 正被其他标签页占用——关掉所有同源页面(包括后台 PWA 窗口)再试
进 about:debugging 后必须清空 Cache Storage
注销只是解除了控制权,Cache Storage 里的缓存文件(比如 precache-v1、runtime-cache)还躺在磁盘上,下次注册时会被直接复用:
- 在
about:debugging#/runtime/this-firefox的 Service Worker 条目下方,点击“缓存存储”链接(不是“检查器”或“调试”) - 进入新页面后,左侧列出所有缓存名称,逐个点击 → 右侧显示条目数和大小 → 点击“删除”按钮(不是“清除”或“刷新”)
- 别漏掉名字带
sw-、v2、offline的缓存,它们往往是 PWA 自动创建的离线兜底缓存 - 如果“缓存存储”链接不显示,说明该 Service Worker 没调用
caches.open(),可跳过这步;但只要用了 Cache API,就必须手动删
用 about:cache 找出并删除底层磁盘缓存残留
Service Worker 本身不存磁盘缓存,但它 fetch() 返回的响应可能被火狐自动存进主缓存(disk cache),导致即使注销后仍返回旧 HTML/JS:
- 访问
about:cache→ 点击“主缓存(disk)”下的“列出缓存条目” - Ctrl+F 搜索目标域名(如
example.com),再细筛 URL 路径含/sw.js、/manifest.json、.html?_v=等典型离线资源标识 - 右键匹配条目 → “删除”,尤其注意那些 Last-Modified 是几天前、但 Size 很大的 JS/CSS 条目
- 别依赖“全部清除”按钮——它只清 HTTP 缓存,对 Cache Storage 和 IndexedDB 无效
为什么“管理数据”清不干净 Service Worker?
“设置 → 隐私与安全 → 管理数据”能删 Cache API 和 IndexedDB,但对已激活的 Service Worker 注册记录是惰性清理:只有当浏览器重启、且该站点无任何标签页打开时,才可能顺带注销。所以它不能替代 about:debugging 的主动操作。
真正顽固的离线问题,往往卡在“注销了但缓存没清”或“缓存清了但磁盘里还有同名响应”。三步缺一不可:先解控(注销),再清存(Cache Storage),最后扫底(about:cache)。少做一步,下次访问就可能瞬间复活旧逻辑。
