What to change to prevent double request from service worker?

ぐ巨炮叔叔 提交于 2020-12-12 11:59:24

问题


Please do not mark as duplicate. This is not an exact duplicate of the other similar questions here on SO. It's more specific and fully reproducible.

  1. Clone this repo.
  2. yarn && yarn dev
  3. Go to localhost:3000 and make sure under (F12)->Applications->Service workers, the service worker is installed.
  4. Go to Network tab and refresh a few times(F5)
  5. Observe how the network requests are doubled.

Example of what I see:


Or if you want to do it manually follow the instructions below:

  1. yarn create-next-app app_name
  2. cd app_name && yarn
  3. in public folder, create file called service-worker.js and paste the following code:
addEventListener("install", (event) => {
  self.skipWaiting();
  console.log("Service worker installed!");
});

self.addEventListener("fetch", (event) => {
  event.respondWith(
    (async function () {
      const promiseChain = fetch(event.request.clone()); // clone makes no difference
      event.waitUntil(promiseChain); // makes no difference
      return promiseChain;
    })()
  );
});
  1. open pages/index.js and just below import Head from "next/head"; paste the following code:
if (typeof window !== "undefined" && "serviceWorker" in navigator) {
  window.addEventListener("load", function () {
    // there probably needs to be some check if sw is already registered
    navigator.serviceWorker
      .register("/service-worker.js", { scope: "/" })
      .then(function (registration) {
        console.log("SW registered: ", registration);
      })
      .catch(function (registrationError) {
        console.log("SW registration failed: ", registrationError);
      });
  });
}
  1. yarn dev
  2. go to localhost:3000 and make sure the service worker has been loaded under (F12)Applications/Service Workers
  3. Go to the Network tab and refresh the page a few times. See how the service worker sends two requests for each one

What do I need to change in the service-worker.js code so that there are no double requests?


回答1:


This is how Chrome DevTools shows requests and is expected.

There is a request for a resource from the client JavaScript to the Service Worker and a request from the Service Worker to the server. This will always happen unless the service worker has the response cached and does not need to check the server for an update.




回答2:


Does not seems the right way to initialize service worker in Next.js.You may need to look into next-pwa plugin to do it right.Here is the tutorial PWA with Next.js



来源:https://stackoverflow.com/questions/61186729/what-to-change-to-prevent-double-request-from-service-worker

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!