HTML元素属性(如manifest、http-equiv)完全无法实现可靠离线缓存,因Application Cache已被Chrome 95+、Firefox 85+、Safari 16.4+彻底移除,manifest被忽略,meta标签仅影响HTTP缓存;唯一可行方案是Service Worker + Cache API,需HTTPS或localhost下注册并显式缓存资源。

不能。HTML 元素属性(如 manifest、http-equiv、cache-control meta 标签)**完全无法实现可靠的离线缓存控制**——所有主流浏览器(Chrome 95+、Firefox 85+、Safari 16.4+)已彻底移除 Application Cache 支持,manifest 属性被忽略,meta 缓存头仅影响 HTTP 缓存,不构成离线能力。
为什么 manifest 属性现在完全无效
你写 <html manifest="app.appcache"> 后页面仍白屏或报错,不是配置漏了,是浏览器根本不再解析它。AppCache 已被标准组织废弃,且存在严重缺陷:缓存更新不可控、资源替换不原子、调试困难、无法拦截 API 请求。现代构建工具(Vite/Webpack)默认不生成 .appcache 文件,服务器也不再要求设置 text/cache-manifest MIME 类型。
-
manifest文件即使能访问,也只会触发控制台警告:Application Cache is deprecated - DevTools → Application → Manifest 面板在新版 Chrome/Firefox 中已移除
- 哪怕你用 Nginx 强制返回
text/cache-manifest,navigator.applicationCache仍是undefined
meta http-equiv="Cache-Control" 只影响 HTTP 缓存,不是离线方案
这类 meta 标签(如 <meta http-equiv="Cache-Control" content="max-age=3600">)只是向浏览器声明“这个 HTML 文档可缓存 1 小时”,它依赖的是浏览器的 HTTP 缓存机制,而非独立的离线存储。断网后能否加载,取决于:index.html 是否已被 HTTP 缓存命中、且其引用的 app.js 和 style.css 是否也恰好被缓存——这不可控、不保证、不完整。
- HTTP 缓存无生命周期管理,无法主动清理旧版本
- 无法拦截
fetch('/api/user')这类请求并 fallback 到备用响应 - 无法处理跨域资源、带凭证的请求、POST 表单提交等场景
真正能控制离线行为的只有 Service Worker + Cache API
唯一可行路径是注册一个 sw.js,并在其中用 caches.open() 和 cache.addAll() 显式声明哪些资源必须离线可用。HTML 本身只是被缓存的目标之一,它依赖的所有 <script src="app.js">、<link href="style.css">、<img src="logo.png"> 都必须列进缓存清单,路径必须是绝对根路径('/index.html' ✅,'./app.js' ❌)。
立即学习“前端免费学习笔记(深入)”;
-
install阶段失败常见原因:清单里任一 URL 返回 404、CORS 拒绝、响应头含Cache-Control: no-store -
fetch事件中必须按event.request.destination分流:只对'document'请求做缓存兜底,'json'请求不能盲目返回旧数据 - 注册前提:必须 HTTPS 或
http://localhost;sw.js必须可直接访问(打开/sw.js应返回 JS 内容,不能是 404 或重定向)
离线能力的关键不在 HTML 标签怎么写,而在 JS 脚本是否接管了请求流——HTML 元素属性连注册入口都没有,更谈不上控制缓存策略或 fallback 行为。



















