manifest文件修改后页面不更新,因浏览器仅在首次加载或manifest字节级变化时检查更新;需手动触发update()并监听updateready事件,再调用swapcache()和location.reload(true)激活新缓存。

manifest文件修改后页面不更新?检查缓存更新触发时机
HTML5离线应用依赖manifest文件触发更新,但浏览器只在**页面首次加载或manifest内容发生字节级变化时**才发起更新检查。单纯改JS逻辑、CSS或资源文件,只要manifest本身没变,就不会拉新缓存。
- 每次修改
manifest必须改动至少一个字符(比如注释末尾加空格、更新版本号) - 避免用时间戳自动生成注释(如
# v1.2.3-20240520),某些构建工具会压缩掉注释导致变更失效 - 浏览器不会主动轮询
manifest,用户需刷新页面(且不是强制刷新Ctrl+F5,那会绕过缓存直接重载)
手动触发更新失败?调用applicationCache.update()前先确认状态
想让老用户立刻更新,得靠JS手动触发,但applicationCache.update()不是万能钥匙——它只在缓存处于idle或uncached状态时有效。如果当前正处在checking或downloading中,调用等于白费。
- 务必监听
updateready事件,而不是一加载就调update() - 典型安全写法:
if (window.applicationCache.status === window.applicationCache.IDLE) { window.applicationCache.update(); } - Chrome 90+ 已弃用
applicationCache,该API在新版中返回undefined,需先判空
更新后页面仍用旧资源?别忘了swapCache()和刷新逻辑
即使updateready触发了,新缓存也只是“已下载”,还没激活。不手动切换,页面继续跑旧版本,这是最常被忽略的一步。
- 必须在
updateready回调里调用applicationCache.swapCache() - 调完
swapCache()后,已加载的JS/CSS不会自动重载,需要显式刷新:window.location.reload(true);
-
reload(true)强制从服务器重载(忽略所有缓存),确保拿到新版本;仅reload()可能又走旧缓存
Chrome/Firefox打不开离线应用?检查HTTPS和MIME类型
现代浏览器对manifest支持极苛刻:HTTP协议下基本禁用,且服务器必须返回text/cache-manifest MIME类型,否则直接忽略整个机制。
立即学习“前端免费学习笔记(深入)”;
- 本地开发用
file://协议?一律失败,必须走http://或https://(哪怕localhost) - Nginx配置示例:
location ~* \.appcache$ { add_header Content-Type "text/cache-manifest"; } - Apache需在
.htaccess或vhost中添加:AddType text/cache-manifest .appcache
实际部署时,manifest更新链条比想象中脆弱:服务端MIME错一位、前端没监听updateready、reload没加true参数——任一环节断掉,用户就卡在旧版本里。别假设“改了manifest就自动生效”。











