【问题标题】:Why are my service workers not working offline为什么我的服务人员不能离线工作
【发布时间】:2020-05-31 04:41:47
【问题描述】:

一切似乎都是正确的,文件正在被缓存,但它不能离线工作。我错过了什么明显的东西吗?

cache.addAll 不想与我的 const FILES_TO_CACHE 一起工作,但是当我直接将它们放入时确实可以工作。因此重复的代码。

这是我的服务工作者文件:

const FILES_TO_CACHE = [
  "/",
  "/index.html",
  "/style.css",
  "/db.js",
  "/index.js",
  "/manifest.webmanifest"
];

const CACHE_NAME = "static-cache-v2";
const DATA_CACHE_NAME = "data-cache-v1";

// install
self.addEventListener("install", function(evt) {
  evt.waitUntil(
    caches.open(CACHE_NAME).then(cache => {
      console.log("Your files were pre-cached successfully!");
      return cache.addAll([
        "/",
        "/index.html",
        "/style.css",
        "/db.js",
        "/index.js",
        "/manifest.webmanifest"
      ]);
    })
  );

  self.skipWaiting();
});

// activate
self.addEventListener("activate", function(evt) {
  console.log("activated");
  evt.waitUntil(
    caches.keys().then(keyList => {
      return Promise.all(
        keyList.map(key => {
          if (key !== CACHE_NAME && key !== DATA_CACHE_NAME) {
            console.log("Removing old cache data", key);
            return caches.delete(key);
          }
        })
      ).catch(err => console.log(err));
    })
  );

  self.clients.claim();
});

// fetch
self.addEventListener("fetch", function(evt) {
  console.log("fetched", evt.request.url);

  if (evt.request.url.includes("/api/")) {
    evt.respondWith(
      caches
        .open(FILES_TO_CACHE)
        .then(cache => {
          return fetch(evt.request)
            .then(response => {
              // If the response was good, clone it and store it in the cache.
              if (response.status === 200) {
                cache.put(evt.request.url, response.clone());
              }

              return response;
            })
            .catch(err => {
              // Network request failed, try to get it from the cache.
              return cache.match(evt.request);
            });
        })
        .catch(err => console.log(err))
    );

    return;
  }
});

html 中的链接:

<script>
      if ("serviceWorker" in navigator) {
        navigator.serviceWorker.register("/service-worker.js").then(function() {
          console.log("Service Worker Registered");
        });
      }
    </script>

我还在 HTML 文件中链接了我的清单。

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: service-worker


    【解决方案1】:

    如果你看这里的最后一行代码:

    // fetch
    self.addEventListener("fetch", function(evt) {
      console.log("fetched", evt.request.url);
    
      if (evt.request.url.includes("/api/")) {
    

    您发现有一个非常简单的错误——您的 Service Worker 响应以“/api/”开头的请求。如果他们不这样做,SW 就不会碰他们。因此,只有“/api/”调用离线工作(这没有任何意义:-),api 大多是动态的,对吧?)。

    (当然,代码中可能还有其他错误,但这是开始进行更改的好点。)

    【讨论】:

    • 谢谢!我之前将其更改为“/”,但它没有工作,但我一定有其他问题,因为现在它就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多