Service Worker 和透明缓存更新

2024-01-12

我正在尝试为一个简单但旧的 Django Web 应用程序安装 ServiceWorker。我开始使用这个例子Chrome 团队的通读缓存示例 https://googlechrome.github.io/samples/service-worker/read-through-caching/index.html

这很有效,但并不理想,因为我想在需要时更新缓存。根据阅读此处所有其他服务人员的答案,有两种推荐的方法可以做到这一点。

  1. 使用一些服务器端逻辑来了解您显示的内容何时更新,然后更新您的 Service Worker 以更改预缓存的内容。例如,这就是 sw-precache 的作用。

  2. 每当您依赖的资源更新时,只需更新 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;

但这行不通。页面加载时卡住。

上面的代码有什么问题吗?实现目标设计的正确方法是什么?


这听起来像https://jakearchibald.com/2014/offline-cookbook/#stale-while-revalidate https://jakearchibald.com/2014/offline-cookbook/#stale-while-revalidate非常接近您要找的东西

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.open('mysite-dynamic').then(function(cache) {
      return cache.match(event.request).then(function(response) {
        var fetchPromise = fetch(event.request).then(function(networkResponse) {
          // if we got a response from the cache, update the cache
          if (response) {
            cache.put(event.request, networkResponse.clone());
          }
          return networkResponse;
        });

        // respond from the cache, or the network
        return response || fetchPromise;
      });
    })
  );
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Service Worker 和透明缓存更新 的相关文章

  • 长时间等待向 Service Worker 发出请求

    我注意到 等待服务工作人员响应缓存中的项目的时间并不像您预期 的那么快 我发现两者的等待时间相同sw precache和一个定制的书面服务人员 造成此等待时间的可能原因是什么 如何减少它 My fetch自定义 Service Worker
  • Workbox仅缓存时间戳到indexDb,如何拦截indexDb中的json数据?

    下面的路由定义将json数据作为MyCachedData存储在缓存存储中 而IndexDb只存储url和时间戳 workboxSW router registerRoute MyApi workboxSW strategies staleW
  • self.skipWaiting() 在 Service Worker 中不起作用

    我有一个服务人员 这是安装事件 self addEventListener install function event console log Installing Service Worker event return self ski
  • Service Worker 更新延迟

    我有一个正在运行的 Web 应用程序 它依靠服务工作人员来检查所有缓存的文件并确保用户使用正确的应用程序版本 我们的客户目前希望设备在特定点 重新打开应用程序时 等检查更新 因为目前当您打开应用程序时 设备最多可能需要 5 分钟才能意识到其
  • 错误:请求对象已被使用

    我不断在控制台日志中收到此错误 未捕获 承诺中 类型错误 无法在 ServiceWorkerGlobalScope 上执行 获取 无法使用已使用的请求对象构造请求 我尝试更改我的 Service Worker 但不起作用 self addE
  • Service Worker skipWaiting 无法激活当前等待的软件

    描述 我们使用 sw precache 来预先缓存脚本 因此为了更新脚本 我们提供了重新加载选项 为此 我们正在监听工作人员消息 以跳过等待新安装的服务工作人员 原因未知 我们没有得到正确的结果 导入脚本 GETTING OLD SW re
  • Service Worker 的中止控制器

    我有一个 LeafletJS 地图 其中包含许多使用服务工作线程缓存的 protobuf 层 这非常有效并且节省了大量的加载时间 我最近添加了一个中止控制器 以在更改缩放级别时停止获取过程 以从浏览器待处理队列中删除当前缩放级别图块 这也节
  • 如何在 Firefox 中调试 Service Worker?

    在 FF 中调试 Service Worker 似乎非常痛苦 我知道从主页我可以 进入应用程序面板 点击 关于调试 在新页面中搜索我的员工以及其他 200 名员工 单击开始 然后单击检查 我必须寻找两个控制台而不是一个并通过 两者之间的消息
  • 如何使用新部署的网站版本(Firebase)从用户浏览器中删除在先前部署中注册的服务工作人员?

    我已通过现有项目将网站的新版本 之前在 Polymer 上 现在在 Vue js 上 部署到 Firebase 我正在使用带有 Webpack 的默认 Vue js 模板 vue init webpack my project 在新项目中
  • 使用 Service Worker 和推送通知做出反应

    一些初步考虑 react 16 8 2 react scripts 2 1 5 我创建了一个新的反应应用程序 我需要实现推送通知 下列的this https developers google com web fundamentals co
  • 在client和serviceWorker之间传输数据

    我想尝试在 serviceWorker 中运行 websockets 我编写了注册serviceWorker的代码 if serviceWorker in navigator navigator serviceWorker register
  • 收到无效的 JSON 负载。未知名称 click_action

    所以我目前正在开发一个 PWA 我现在正在与推送通知我已经能够使用以下非常简单的 JSON 结构接收后台和前台通知 message token aValidToken notification title New Content body
  • 如何使用具有 BASIC 身份验证的 Service Worker(NTLM、协商)

    我一直在尝试在 IIS 托管网站中使用服务工作线程来缓存该网站的一些静态内容 该站点是使用 Windows 身份验证的内部应用程序 我已经能够注册并运行服务工作线程 没有太多麻烦 但是一旦我打开缓存并开始向缓存添加文件 承诺就会因授权失败而
  • 如何在 create-react-app 中以开发模式启用 Service Worker?

    我知道我们可以在生产模式下测试我们的 Service Worker 但是重新构建和部署的过程非常烦人 有什么方法可以在开发模式下启用服务工作者吗 改变这个 window addEventListener load gt const swUr
  • 使用 Asynchronous ReadableStream 和 Response 从 Service Worker 的 fetch 事件返回 HTML

    这个问题类似于我的另一个问题 https stackoverflow com questions 62457644 use readablestream with response to return html from fetch eve
  • 如何从扩展服务工作人员创建网络工作人员

    我将首先解释我想要实现的目标 我想创建一个扩展程序 可以在不同 chrome 窗口上的选项卡之间切换 并显示每个选项卡 X 时间 我发现了一个类似的扩展 但它是使用manifest V2完成的 并且不支持多个窗口 我想通过为每个窗口创建一个
  • 检测 Service Worker 离线状态的最佳实践

    我有一个服务工作者应该缓存一个offline html客户端没有网络连接时显示的页面 然而 有时它会认为导航器已离线 即使它并未离线 那是 navigator onLine false 这意味着用户可能会得到offline html而不是实
  • 列出 chrome 注册的 Service Worker

    有没有办法列出所有注册服务人员的浏览器 假设我已经注册 安装了一些服务人员 我可以通过js获取文件名数组列表吗 显然我找到了两种适合我的方法 对于 Chrome 一种是使用快捷命令 chrome serviceworker internal
  • 什么是 Service Worker 控制台? & 它在 Chrome 浏览器中的什么位置?

    我正在研究推送通知并遇到一个陌生的术语 service worker console 我已阅读并使用过该术语console log or web console在浏览器中 但我不熟悉这个术语service worker console 之后
  • Service Worker 与 Shared Worker

    Service Worker 和 Shared Worker 有什么区别 我什么时候应该使用 Service Worker 而不是 Shared Worker 反之亦然 Service Worker 具有共享 Worker 之外的附加功能

随机推荐