html5静态网页如何设置缓存_离线应用manifest用法【教程】

发布时间 - 2026-01-01 00:00:00    点击率:
HTML5 manifest 已被所有主流浏览器彻底弃用,因其依赖存在严重缺陷的 AppCache 机制;W3C 标记为 obsolete,WHATWG 标准已删除;替代方案唯一可行的是 Service Worker + Cache API,需 HTTPS 环境、两次刷新生效,并精细管理缓存版本。

HTML5 的 manifest 已被现代浏览器彻底弃用,不能用于新项目。Chrome 从 94 版本起移除支持,Firefox 85+、Safari 早已禁用,所有主流浏览器均返回 DOMException: Failed to set the 'manifest' property on 'HTMLDocument' 或直接忽略

manifest 文件为什么完全失效了

它依赖过时的 AppCache 机制,存在严重设计缺陷:缓存更新不透明、资源失败导致整个缓存失效、无法按需更新单个文件、HTTPS 下行为不一致等。W3C 已将其标记为 obsolete,WHATWG HTML 标准中已删除该章节。

  • 访问含 manifest 属性的页面时,开发者工具 Network 面板不再显示 manifest 请求
  • navigator.onLinewindow.applicationCache 在新版本浏览器中为 undefined
  • 即使服务端返回正确的 text/cache-manifest MIME 类型,浏览器也完全不解析

替代方案:Service Worker + Cache API 是唯一可行路径

离线能力必须通过 Service Worker 实现,它支持精细控制缓存策略、版本化更新、后台同步等。

  • 必须在 HTTPS(或 localhost)环境*册,http:// 域名下会静默失败
  • 注册代码必须放在主页面的 JS 中,且不能在模块脚本(type="module")里直接调用 navigator.serviceWorker.register()
  • 首次注册后,页面需**刷新两次**才能生效:第一次注册 SW,第二次才由 SW 控制页面
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.js 仅缓存 HTML、CSS、JS、字体和图片,适用于纯静态站点,不处理动态请求或 API。

立即学习“前端免费学习笔记(深入)”;

  • 使用 cache.addAll() 预缓存关键资源,避免首次离线白屏
  • fetch 事件中优先匹配缓存,未命中再发网络请求(stale-while-revalidate 策略)
  • 每次更新 sw.js 文件内容(如改注释),浏览器才会触发新版本安装
const CACHE_NAME = 'static-v1';
const FILES_TO_CACHE = [
  '/',
  '/index.html',
  '/style.css',
  '/script.js',
  '/assets/logo.png'
];

self.addEventListener('install', (e) => {
  e.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(FILES_TO_CACHE))
  );
});

self.addEventListener('fetch', (e) => {
  e.respondWith(
    caches.match(e.request)
      .then(response => response || fetch(e.request))
  );
});

真正棘手的是缓存版本管理与更新逻辑——比如如何让用户感知新版本可用、是否自动刷新页面、第三方资源(如 CDN 字体)能否缓存,这些细节没处理好,离线体验反而更差。


# css  # html  # js  # go  # html5  # 浏览器  # app  # 工具  # safari  # ai  # win  # cdn  # 为什么  # red  # firefox  # chrome  # while  # register  # Property 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  ,南京靠谱的征婚网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  魔方云NAT建站如何实现端口转发?  EditPlus中的正则表达式 实战(2)  Laravel中的Facade(门面)到底是什么原理  js实现获取鼠标当前的位置  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何在Windows虚拟主机上快速搭建网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Java解压缩zip - 解压缩多个文件或文件夹实例  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Python3.6正式版新特性预览  Android中AutoCompleteTextView自动提示  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Swift开发中switch语句值绑定模式  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  北京网站制作的公司有哪些,北京白云观官方网站?  如何用IIS7快速搭建并优化网站站点?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  java中使用zxing批量生成二维码立牌  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何快速搭建虚拟主机网站?新手必看指南  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何用已有域名快速搭建网站?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  简单实现Android文件上传  JavaScript实现Fly Bird小游戏  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何生成腾讯云建站专用兑换码?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  黑客如何利用漏洞与弱口令入侵网站服务器?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  iOS中将个别页面强制横屏其他页面竖屏  Laravel如何实现本地化和多语言支持?(i18n教程)  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化