javascript - 如何让 service worker 只在第一次访问时注册?

标签 javascript service-worker service-worker-events

您好,我在 express 上有一个生成 HTML 的 ejs 模板。我在这个模板中写了我的 service worker 注册码,这个模板对网站的所有页面都是通用的,因此,注册码最终出现在网站的每个页面上。因此,在每次用户访问时,都会运行 service worker 注册代码,我认为这是不好的。如何让这段代码只在用户第一次访问时运行?

请在下面找到我的代码:

<script>
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function() {
          var hashes = {};
          ["appCss", "appJs"].map((val,idx) => {
              let prop;
              if(document.getElementById(val)) {
                  prop = val.toLowerCase().indexOf("css") == -1 ? "src" : "href";
                  hashes[val] = document.getElementById(val)[prop];
              }
          });
          hashes = JSON.stringify(hashes);
          navigator.serviceWorker
              .register(`/service-worker.js?hash=${encodeURIComponent(hashes)}`)
              .then(function(registration) {
                  console.log('ServiceWorker registration successful with scope: ', registration.scope);
              }, function(err) {
                  console.log('ServiceWorker registration failed:', err);
              });
      });
    }
</script>

最佳答案

来自MDN documentation :

The register() method of the ServiceWorkerContainer interface creates or updates a ServiceWorkerRegistration for the given scriptURL.

If successful, a service worker registration ties the provided script URL to a scope, which is subsequently used for navigation matching. You can call this method unconditionally from the controlled page. I.e., you don't need to first check whether there's an active registration.

所以你应该总是在你的页面上调用register。浏览器 API 将为您处理此问题。

关于javascript - 如何让 service worker 只在第一次访问时注册?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636941/

相关文章:

javascript - 公牛上的槽和奶头 HTML 模板

service-worker - 离线时如何从登录页面开始使用渐进式网络应用程序

javascript - 服务人员 : async await in combination with waituntil is not working properly

javascript - 为什么 Service Worker 离线模式不起作用

service-worker - 识别 FetchEvent 请求的来源/来源

javascript - 检查链接(不是 URL)是否包含某些文本(.jpg、.gif、.png)

javascript - 同一页面JS多个倒计时

javascript - Service Worker 失败 - RedirectMode 不是 "follow"时的重定向响应

javascript - 在javascript中创建过滤器以通过url过滤结果

Angular PWA 离线数据处理