applicationcache已废弃,http缓存仍广泛使用;真要离线应改用service worker。前者依赖.manifest文件、逻辑反直觉且被主流浏览器移除;后者靠响应头控制、资源独立缓存;service worker需https注册、手动缓存资源并处理生命周期事件。

HTML 离线机制(applicationCache)和浏览器缓存(HTTP 缓存)根本不是一回事,不能混用,也不能互相替代。前者已废弃,后者仍在广泛使用。
applicationCache 已被标准弃用,别再新项目里用了
applicationCache 是 HTML5 早期提出的离线方案,依赖 .manifest 文件和 html manifest="xxx" 声明。但它存在严重缺陷:缓存更新逻辑反直觉、无法细粒度控制、强耦合整个页面生命周期,且所有主流浏览器自 2020 年起陆续移除支持(Chrome 95+ 完全删除,Firefox 85+ 废弃)。
- 即使你写了
manifest文件,现代浏览器会静默忽略,不报错也不生效 -
window.applicationCache在最新 Chrome/Firefox/Safari 中返回undefined - 服务端配置
AddType text/cache-manifest .manifest已无实际意义
HTTP 缓存靠响应头,和 HTML 文件本身无关
浏览器缓存是协议层行为,由服务器返回的 HTTP 响应头决定,比如 Cache-Control: max-age=3600 或 Expires。它对每个资源独立生效,不依赖 HTML 标签或清单文件。
-
index.html可以设为no-cache,而logo.png设为max-age=31536000,完全解耦 - 命中强缓存时,连请求都不会发出去;命中协商缓存(如
If-Modified-Since)则可能收到304 - 修改 HTML 文件内容但不改响应头,浏览器仍可能读旧缓存——这不是 bug,是设计如此
真要离线?用 Service Worker 替代 applicationCache
当前唯一标准、可控、可调试的离线方案是 Service Worker。它通过 JavaScript 拦截 fetch 请求,自主决定缓存策略、更新逻辑和回退行为。
- 必须在 HTTPS 下注册(localhost 除外),否则
navigator.serviceWorker.register()失败 - 首次访问不会激活 SW,第二次加载才生效;需手动触发
skipWaiting()才能立即更新 - 缓存资源要用
caches.open().put()显式存,不能靠声明式清单 - 调试看
Application → Service Workers面板,而不是过时的Resources → Application Cache
本地存储(localStorage/sessionStorage)和离线缓存也不同
localStorage 存的是键值对字符串,用于保存用户偏好、表单草稿等小数据;它不参与页面资源加载流程,也不会让 index.html 在断网时打开。
-
localStorage.setItem('theme', 'dark')和页面是否能离线访问毫无关系 - 它没有过期机制,除非代码调用
removeItem()或clear() - 同域下多个 tab 共享同一份
localStorage,但sessionStorage是 per-tab 的
真正容易被忽略的点是:很多人以为改了 HTML 的 manifest 属性或加了 Cache-Control 就等于“搞定离线”,其实二者作用域、生效条件、调试路径完全不同。现在想让页面离线可用,必须写 Service Worker 脚本并正确处理 install/activate/fetch 事件——没别的捷径。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











