Динамическое имя кэша в service worker

#javascript #progressive-web-apps #service-worker #workbox

#javascript #progressive-веб-приложения #service-worker #workbox

Вопрос:

Мне было интересно, как я мог бы использовать динамическое имя кэша? В принципе, я хочу иметь возможность очищать кеш для определенного URL. Итак, я подумал, что мог бы создать кеш с именем formA, formbи т.д. … и когда форма будет заполнена, я хочу очистить / удалить этот кеш.

Ситуация: у меня есть 2 формы, которые имеют общий css, js, а также общий serviceworker и т.д… Но я хочу иметь возможность сделать их доступными в автономном режиме. Итак, я хочу сохранить их в кэше, например «formA-cache» и «formbcache», кэшируя соответствующие ресурсы forms.

И когда они будут заполнены, отправьте их и очистите их от кэша.

На данный момент это мой Service worker, использующий Google Workbox.

 importScripts(
    "https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js"
  );
  
  const { skipWaiting, clientsClaim } = workbox.core;
  const { registerRoute } = workbox.routing;
  const { NetworkFirst } = workbox.strategies;
  
  skipWaiting();
  clientsClaim();
  
  workbox.precaching.precacheAndRoute([
    "/etc.clientlibs/fd/af/runtime/clientlibs/guideRuntime/resources/images/busy-state.gif",
    "/etc.clientlibs/fd/af/runtime/clientlibs/widgets/numericStepper/resources/images/Minus.svg",
    "/etc.clientlibs/fd/af/runtime/clientlibs/widgets/numericStepper/resources/images/Plus.svg",
    "/etc.clientlibs/fd/rte/gui/components/clientlibs/core/resources/List_a.svg",
    "/etc.clientlibs/fd/rte/gui/components/clientlibs/core/resources/List_ordered.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Accordion-Add-Default.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Accordion-Delete-Default.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Chevron-Active.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Chevron-Right-Hover.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Chevron-Right-White.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Minus.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Minus_Hover.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Plus.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Plus_Hover.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Save.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Submit-Hover.svg",
    "/etc/clientlibs/fd/themes/dev-team-theme/assets/Table-Edit-Default.svg",
  ]);
  
  registerRoute(
    ({ request }) => {
      console.log("    ", request.url);
      return (
        request.destination === "iframe" ||
        request.destination === "document" ||
        request.destination === "image" ||
        request.destination === "script" ||
        request.destination === "style" ||
        request.destination === "font"
      );
    },
    new NetworkFirst({
      cacheName: "abc-forms", // This needs to become formA-cache, formB-cache etc...
    })
  );
  
  

Любая помощь или идеи приветствуются!

Спасибо

Марио

Ответ №1:

Хотя вы могли бы создать именованный кэш для всех URL-адресов, я бы не советовал этого. Вместо этого напишите процедуру аннулирования кэша, чтобы очистить кэшированную версию и заменить новой.

Пока вы знаете, в каком именованном кэше оно находится, вы можете просто кэшировать новую версию, и она заменит старую версию.

Если вы не знаете, в каком именованном кэше кэшируется ответ, вам нужно будет перебрать все именованные кэши, чтобы увидеть, кэширован ли ответ для этого. В основном найдите целевой кэш с именем.