Vue PWA离线页面如何动态显示缓存状态?
我正在开发一个Vue PWA应用,想在页面顶部实时显示离线/在线状态。按教程写了service worker但遇到问题:
<template>
<div>
网络状态:{{ isOnline ? '在线' : '离线' }}
</div>
</template>
<script>
export default {
data() {
return {
isOnline: navigator.onLine
}
},
mounted() {
window.addEventListener('online', () => this.isOnline = true)
window.addEventListener('offline', () => this.isOnline = false)
}
}
</script>
虽然能初始显示状态,但切换飞行模式后不会更新。用Chrome应用工具看,service worker确实在运行,但页面状态始终显示在线。试过检查navigator.serviceWorker.registered状态也没用,求大神指点哪里没搞对?
关键点:
1. 把事件处理抽成单独方法,避免箭头函数导致的内存泄漏
2. mounted时手动触发一次状态更新
3. 记得在组件销毁时移除监听
如果还不行,可能是service worker缓存问题。试试在Chrome开发者工具的Application面板里:
1. 点Clear storage
2. 勾选Unregister service workers
3. 重新加载页面
另外吐槽下,navigator.onLine在某些安卓机型上会抽风,生产环境建议加上心跳检测兜底。
要在Vue里动态显示缓存状态,得通过Service Worker的message事件来通信。首先在你的Service Worker文件里加个状态广播:
然后在Vue组件里监听这个消息事件,更新状态:
这样改完就好了。不过说实话,PWA这块儿的坑确实多,我都踩过好几次。记得测试的时候要清缓存,不然老版本的Service Worker会捣乱。如果想省事,Workbox插件可以帮你简化很多配置,推荐试试。