manifest 属性已被所有主流浏览器弃用并移除,无法实现离线缓存;替代方案是必须使用 Service Worker,它支持精细缓存控制、原子更新和事件驱动生命周期。

manifest 属性早已被现代浏览器弃用,**不能用于实现离线缓存**。Chrome 从 78 版本、Firefox 从 72 版本起彻底移除了对 applicationCache(即 manifest)的支持,Safari 也早在 iOS 12.2 / macOS 10.14.4 中禁用。现在使用它只会触发控制台警告,且完全不生效。
为什么 manifest 不再可用
该机制存在设计缺陷:缓存更新逻辑不可控、主文档强制缓存、版本更新需两次访问才生效、无法按需更新子资源。W3C 已将其从标准中删除,WHATWG 明确标记为“obsolete”。所有主流浏览器均已移除底层实现。
替代方案必须用 Service Worker
当前唯一标准化、可依赖的离线缓存方案是 Service Worker。它支持精细控制缓存策略、网络回退、版本原子更新和事件驱动生命周期。
-
Service Worker需在 HTTPS(或localhost)环境下注册,否则会静默失败 - 注册代码必须放在页面顶层 JS 中,不能在模块或异步回调里调用
navigator.serviceWorker.register() - 首次注册后,
install事件只在新 Service Worker 安装时触发;更新靠fetch事件拦截 +cache.put()实现,不是靠文件哈希比对 - 调试时注意:刷新页面不会立即启用新 SW,需关闭所有标签页或点 “Skip waiting” 才能激活
manifest 文件写法已无实际意义,但常见残留错误
如果你在旧项目中看到类似这样的 HTML:
<html manifest="cache.manifest">
——这行代码不会报错,但也不会触发任何缓存行为。浏览器忽略 manifest 属性,且控制台会输出:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
立即学习“前端免费学习笔记(深入)”;
The application cache API is deprecated and will be removed soon.
- 即使
cache.manifest文件存在且格式正确(含CACHE MANIFEST头、CACHE/NETWORK/FALLBACK段),也完全无效 - 不要尝试用
applicationCacheAPI(如window.applicationCache)检测或监听状态,该对象在新浏览器中为undefined - 构建工具(如 Webpack)若仍生成
manifest文件,属于过时配置,应移除相关插件(如webpack-manifest-plugin的旧用法)
迁移建议:最小可行 Service Worker 示例
替换 manifest 最简路径是部署一个基础 SW 脚本:
self.addEventListener('install', e => {
e.waitUntil(
caches.open('v1').then(cache => cache.addAll([
'/',
'/index.html',
'/styles.css',
'/app.js'
]))
);
});
self.addEventListener('fetch', e => {
e.respondWith(
caches.match(e.request).then(r => r || fetch(e.request))
);
});
然后在页面中注册:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
-
caches.open()创建命名缓存,cache.addAll()是原子操作,任一资源失败则整个 install 失败 -
caches.match()查找命中缓存,未命中才走网络,这是最简“缓存优先”策略 - 后续要支持动态资源(如 API)、后台同步、推送通知,都基于同一套
Service Worker生命周期扩展
Service Worker 的复杂性——比如缓存清理、版本升级逻辑、请求分类(静态资源 vs API)、与 Cache-Control 头的协同。这些细节没法靠删掉一行 manifest 属性解决。


















