manifest 文件在2026年5月已完全失效,所有主流浏览器静默忽略;service worker 是唯一可行替代方案,需满足 https、同源注册、正确编写 install/fetch 逻辑三前提。

manifest 文件在当前(2026年5月)完全无效,所有主流浏览器已彻底移除支持。Chrome 94+、Firefox 85+、Safari 16.4+ 均静默忽略 html manifest="xxx.manifest" 属性,不发起请求、不报错、也不缓存任何资源。
你看到的旧教程里“能跑通”的现象,基本只出现在:本地 file:// 协议(不支持注册 SW 也不该用 manifest)、过时浏览器内核(如某些 Electron 封装版)、或开发者工具未刷新导致的错觉。
manifest 属性为什么一定不能用了
-
window.applicationCache和navigator.onLine在新版本中返回undefined - 开发者工具 Application 面板里 Manifest 选项卡已消失,只剩 Service Workers
- 即使服务器正确返回
Content-Type: text/cache-manifest,浏览器也直接跳过解析 - W3C 标准已将 Application Cache 标记为
obsolete,WHATWG HTML 规范中彻底删除该章节
sw.js 是唯一可行的替代方案
Service Worker 不是“可选升级”,而是当前唯一被标准支持、全平台可用、可调试可控的离线缓存机制。它必须满足三个硬性前提:
- 页面必须通过
https://或@#@#@#@#@#@#@#@#@#@0提供(file://不行) -
sw.js必须与页面同源,且路径在注册时写对(例如注册/sw.js,文件就得放在域名根目录下) - 注册代码不能写在
type="module"脚本里,否则navigator.serviceWorker可能未定义
示例注册代码(放主页面 JS 中):
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered: ', reg.scope))
.catch(err => console.error('SW registration failed: ', err));
});
}
sw.js 缓存逻辑最容易漏掉的关键点
- 首次访问只注册 SW,不会触发
install;必须刷新一次,第二次才真正控制页面 - 更新缓存不是改 HTML 或资源文件,而是改
sw.js文件内容本身(哪怕只加一个空格),浏览器才会拉取新脚本并走新install -
cache.addAll()里列的路径必须全部可 fetch 成功,任一失败会导致整个 install 失败,缓存为空 -
fetch事件里必须显式调用event.respondWith(),否则请求照常走网络,缓存形同虚设 - 旧缓存不会自动清理,需在
activate阶段手动caches.delete('old-cache-name')
真正要让静态网页离线可用,核心就三件事:HTTPS 环境、注册 sw.js、在 install 和 fetch 里写实缓存逻辑。任何绕开这三步、还想着靠 manifest 的配置,都会在真实用户环境里彻底失效。











