当前位置: 首页 > 知识库问答 >
问题:

缓存更新上的Service Worker重新加载页面

李弘光
2023-03-14

我正在使用React Service Worker脱机插件为网站创建一个具有持久缓存的Service Worker。

我想告诉用户什么时候cach中存储了新版本,并建议刷新页面,但我不知道如何引用服务工作以及应该听什么事件(服务工作由npm“离线插件”自动创建)。

今天的标准流量:

  1. 网站管理员发布网站(V1)
  2. 用户访问网站
  3. 他查看网站(V1),而服务人员将页面存储在持久缓存中
  4. 网站管理员发布新版本(V2)
  5. 当web工作者在后台加载新版本(V2)时,用户重新访问站点,从持久缓存中看到旧版本
  6. 当用户刷新页面时,他将看到网站版本2

新流量应为:

共有2个答案

慕胡媚
2023-03-14

您应该查看以下链接:服务人员生命周期-更新

您还可以通过运行以下操作手动更新service worker:

navigator.serviceWorker.register('/sw.js').then((reg) => {  
  // sometime later…     
  reg.update(); 
});

您可以在服务人员的install事件中判断新版本已准备就绪(但尚未激活)
您知道服务人员的activate事件的处理程序中加载了新版本。

杨曜瑞
2023-03-14

服务工作者是webworker的一种特殊形式
注册软件时,例如在serviceWorkerRegistry中。js,您可以访问多个事件<例如。

serviceWorkerRegistry.js:

if (!navigator.serviceWorker) return;

navigator.serviceWorker.register('/sw.js').then(function(reg) {
    if (!navigator.serviceWorker.controller) {
      return;
    }

    if (reg.waiting) {
      console.log("inside reg.waiting");
      return;
    }

    if (reg.installing) {
      console.log("inside reg.installing");
      return;
    }

    reg.addEventListener('updatefound', function() {
      console.log("inside updatefound");
      let worker = reg.installing;
      worker.addEventListener('statechange', function() {

        if (worker.state == 'installed') {
          console.log('Is installed');
          // Here you can notify the user, that a new version exist.
              // Show a toast view, asking the user to upgrade.
              // The user accepts.
              // Send a message to the sw, to skip wating.
              worker.postMessage({action: 'skipWaiting'});

        }
      });
    });
  });

sw.js:
// You need to listen for a messages
self.addEventListener('message', function(event) {
  if (event.data.action === 'skipWaiting') {
    self.skipWaiting();
  }
});

现在离线插件的问题是,它为您创建了sw,这样就很难理解sw在做什么。
我会说,最好创建自己的sw,这样你可以更好地理解功能。这插件可以帮助你缓存。

 类似资料:
  • 我正在使用react Redux实现两种不同类型用户登录。这是我的登录方法: 对于第一种类型的用户,我从后端返回:令牌、电子邮件、id、姓氏。 对于第二种类型的用户,我从后端返回:token、email、id、type。 我做了一些第二类用户无法访问的安全路由。因此,如果返回变量,我将为该用户定义特定的路由。 如果返回变量,它将正确显示链接和redux存储中的所有内容。但是,如果我重新加载页面,那

  • 我已经实现了Workbox,以使用webpack生成我的服务人员。这非常有效-我可以确认,在运行(package.json:)时,已在生成的服务工作人员中更新了

  • 问题内容: 我将如何更新每两秒钟在服务器上更新一次的映像,而无需用户按下刷新按钮,我的第一个猜测是ajax,但我之前从未真正使用过它。有人能指出我正确的方向吗? 编辑:忘记提及图像是由perl脚本生成的.gif-尝试通过url抓取它返回脚本 问题答案: 您的Perl脚本似乎有问题。尝试通过URL访问图像应该仍然返回图像。它应该返回二进制数据而不是脚本。您还应该将响应的Content- type标头

  • 问题内容: 我从数据库获取数据并将其显示在div中…我要做的是单击链接时应更改div的内容 一种选择是通过URL将参数传递给自身并重新加载页面… 我需要这样做而 无需重新加载\刷新 … 目的是当我单击任何链接时,div和php变量的内容无需刷新即可更新....这样 用户可以看到新数据 ,然后如果执行某些查询,它将在新变量上 ps我知道它将需要一些AJAX,但我不知道AJAX ..所以请以我可以学习

  • 问题内容: 我正在辩论应该如何学习。主要是,如果我从数据库中获取大量信息以将其加载到页面上,那么最好的方式是操纵页面而不需要重新加载。使用XML之类的东西是最好的选择,还是我应该使用的其他东西。我知道其中很多使用HTML Dom和XML Dom,但是我不想开始学习我不需要的东西。 问题答案: 您正在寻找的技术名称是AJAX,它代表异步Javascript和XML(尽管目前大多数AJAX使用JSON

  • 我想重新加载页面。我该怎么做?