manifest属性已彻底失效,Chrome 95+、Firefox 85+、Safari 16.4+均从代码中删除Application Cache,浏览器静默忽略<html manifest="xxx">,不发请求、不报错、不缓存;唯一可行方案是Service Worker,通过fetch事件动态控制缓存与离线降级。

manifest 属性已经彻底失效,**配了也没用**。Chrome 95+、Firefox 85+、Safari 16.4+ 均已从代码中删除 Application Cache 实现,连请求都不会发出去——你加了 manifest="cache.appcache",浏览器既不报错,也不缓存,更不会触发任何逻辑。
为什么 manifest 属性在 HTML 中完全无效
这不是配置路径错、MIME 类型漏或者服务器没重启的问题,而是底层支持被删干净了:
-
window.applicationCache返回undefined - DevTools 的 Application 面板里“Manifest”选项卡早已消失
-
<html manifest="xxx">在 HTML 解析阶段就被忽略,不进入任何缓存流程 - 即使服务器返回
Content-Type: text/cache-manifest,浏览器也直接跳过读取
Service Worker 是唯一可行的离线方案
真正能控制“断网时返回什么”的,只有 fetch 事件监听器。它不依赖声明式清单,而是运行时动态决策:
- 先查缓存:
caches.match(event.request) - 没命中就发网络请求:
fetch(event.request) - 网络失败时手动 fallback:
caches.match('/offline.html') -
/offline.html必须在install阶段预缓存,否则 fallback 也会白屏
/offline.html 必须自包含所有资源
这个降级页本身不能依赖外部加载:
- 避免写
<script src="/js/app.js"></script>—— 如果/js/app.js没进urlsToCache,脚本就加载失败 - 推荐内联关键 CSS/JS,或只引用已明确列入
cache.addAll([])的路径 - 路径大小写、后缀、相对位置必须和缓存列表里完全一致
首次访问无法触发离线降级是设计使然
Service Worker 注册后,第一次访问页面时 SW 还没激活,所有请求走网络;只有第二次刷新(或关闭再打开)才可能命中缓存逻辑:
立即学习“前端免费学习笔记(深入)”;
- 用户第一次断网访问,
/offline.html不会生效,页面直接报net::ERR_INTERNET_DISCONNECTED - 没法让“首屏就离线可用”,只能保证“二次访问后具备降级能力”
- 若强需求首屏离线,得配合 SSR 或 SSG,把降级内容直接塞进 HTML 响应体
manifest 属性、所有 .appcache 文件、所有服务器 MIME 配置,然后从头写 sw.js —— 否则你调的不是缓存,是在调试一个不存在的机制。



















