我正在尝试为一个简单但旧的 Django Web 应用程序安装 ServiceWorker。我开始使用这个例子Chrome 团队的通读缓存示例 https://googlechrome.github.io/samples/service-worker/read-through-caching/index.html
这很有效,但并不理想,因为我想在需要时更新缓存。根据阅读此处所有其他服务人员的答案,有两种推荐的方法可以做到这一点。
使用一些服务器端逻辑来了解您显示的内容何时更新,然后更新您的 Service Worker 以更改预缓存的内容。例如,这就是 sw-precache 的作用。
每当您依赖的资源更新时,只需更新 Service Worker JS 文件中的缓存版本(请参阅上面缓存示例的 JS 文件中的注释)。
对我来说这两个都不是很好的解决方案。首先,这是一个愚蠢的遗留应用程序。我没有 sw-precache 依赖的应用程序堆栈。其次,其他人更新将要显示的数据(它基本上是带有详细信息页面的事物列表)。
我想尝试一下 Jake Archibald 在他的文章中建议的“使用缓存,但从网络更新缓存”离线食谱 https://jakearchibald.com/2014/offline-cookbook/#cache-then-network但我无法让它发挥作用。
我最初的想法是,我应该能够在服务工作人员中返回缓存版本,但要对一个函数进行排队,如果网络可用,该函数将更新缓存。例如,在 fetch 事件监听器中类似这样
// If there is an entry in cache, return it after queueing an update
console.log(' Found response in cache:', response);
setTimeout(function(request, cache){
fetch(request).then(function(response){
if (response.status < 400 && response.type == 'basic') {
console.log("putting a new response into cache");
cache.put(request, response);
}
})
},10, request.clone(), cache);
return response;
但这行不通。页面加载时卡住。
上面的代码有什么问题吗?实现目标设计的正确方法是什么?