我正在尝试为我的网络应用程序实现离线功能,但我在离线时遇到了一些奇怪的行为,这可能是我缺少的东西,因为它在 Chrome 和 Firefox 中都可以重现。
我将在下面描述我创建的示例应用程序的作用:
重现步骤
- 打开一个新的 Chrome 选项卡并打开控制台视图。
- 导航到示例应用程序(托管在 Netlify 上)。
- 观察日志消息,确认 Service Worker 的安装和激活,以及应用缓存存储的创建和填充。
- 转到开发人员工具中的应用程序选项卡并确认已创建并填充缓存
- 在“Service Worker”下启用“离线”以使网络不可用。
- 或者,只需关闭您的 wifi/网络。
- 刷新页面。
观察到的行为
MyCache
服务工作者之前创建的缓存存储消失了。
预期行为
- 该页面无法按预期加载,但缓存存储在刷新后应保持可用,以便应用可以在离线时使用它来提供内容。
HTML 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vanishing cache storage test</title>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then((registration) => {
console.log('Service worker registered sucessfully:', registration);
})
.catch((error) => {
console.error('Failed to register service worker:', error.stack);
});
});
}
</script>
</head>
<body>
<h1>Hi!</h1>
</body>
</html>
服务人员
const CACHE_NAME = 'MyCache';
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
return cache.add('/');
})
.then(() => {
console.debug(CACHE_NAME, 'created and populated');
})
);
});
self.addEventListener('activate', (event) => {
console.debug('SW activated');
});
操作系统+浏览器版本
Google Chrome 版本:87.0.4280.141(官方构建)(x86_64) Firefox 版本:85.0b5(64 位,开发者版) 操作系统:macOS v11.1(Big Sur)
问题
这是预期的行为吗?如果是这样,为什么?
笔记
- 我无法在 Safari 上进行测试,因为我没有可视化缓存存储内容的可见方法(啊!)。
- 在 Firefox 上刷新后,您可能需要关闭并重新打开 devtools 以使“存储”选项卡自行刷新。