срок действия рабочего ящика

Довольно часто возникает желание наложить ограничения на кэш с точки зрения того, как долго он должен позволять элементам храниться в кеше или сколько элементов должно храниться в кеше. Workbox предоставляет эту функциональность через плагин workbox-expiration , который позволяет ограничить количество записей в кеше и/или удалить записи, которые были кэшированы в течение длительного периода времени.

Ограничить количество записей в кэше

Чтобы ограничить количество записей, хранящихся в кеше, вы можете использовать опцию maxEntries следующим образом:

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {ExpirationPlugin} from 'workbox-expiration';

registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new ExpirationPlugin({
        maxEntries: 20,
      }),
    ],
  })
);

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

Ограничить возраст кэшированных записей

Чтобы ограничить продолжительность кэширования запроса, вы можете определить максимальный возраст в секундах, используя параметр maxAgeSeconds , например:

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {ExpirationPlugin} from 'workbox-expiration';

registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new ExpirationPlugin({
        maxAgeSeconds: 24 * 60 * 60,
      }),
    ],
  })
);

Плагин будет проверять и удалять записи после каждого запроса или обновления кэша.

Расширенное использование

Если вы хотите использовать логику истечения срока действия отдельно от любого другого модуля Workbox, вы можете сделать это с помощью класса CacheExpiration .

Чтобы применить ограничения к кешу, вы должны создать экземпляр CacheExpiration для кеша, которым хотите управлять, следующим образом:

import {CacheExpiration} from 'workbox-expiration';

const cacheName = 'my-cache';
const expirationManager = new CacheExpiration(cacheName, {
  maxAgeSeconds: 24 * 60 * 60,
  maxEntries: 20,
});

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

await openCache.put(request, response);

await expirationManager.updateTimestamp(request.url);

Затем, когда вы захотите истечь срок действия набора записей, вы можете вызвать метод expireEntries() , который будет применять настройки maxAgeSeconds и maxEntries .

await expirationManager.expireEntries();

Типы

CacheExpiration

Класс CacheExpiration позволяет определить срок действия и/или ограничение количества ответов, хранящихся в Cache .

Характеристики

  • конструктор

    пустота

    Чтобы создать новый экземпляр CacheExpiration, вы должны указать хотя бы одно из свойств config .

    Функция constructor выглядит так:

    (cacheName: string, config?: CacheExpirationConfig) => {...}

    • имя кэша

      нить

      Имя кэша, к которому применяются ограничения.

    • конфигурация

      CacheExpirationConfig необязательно

  • удалить

    пустота

    Удаляет хранилище объектов IndexedDB, используемое для отслеживания метаданных об истечении срока действия кэша.

    Функция delete выглядит так:

    () => {...}

    • возвращает

      Обещание<void>

  • истекаетЗаписи

    пустота

    Истекает срок действия записей для данного кэша и заданных критериев.

    Функция expireEntries выглядит так:

    () => {...}

    • возвращает

      Обещание<void>

  • isURLExpired

    пустота

    Может использоваться для проверки того, истек ли срок действия URL-адреса перед его использованием.

    Это требует поиска в IndexedDB, поэтому может работать медленно.

    Примечание. Этот метод не удалит кэшированную запись. Для удаления записей indexedDB и Cache вызовите expireEntries() .

    Функция isURLExpired выглядит так:

    (url: string) => {...}

    • URL

      нить

    • возвращает

      Обещание <логическое значение>

  • обновлениеTimestamp

    пустота

    Обновите временную метку для данного URL-адреса. Это гарантирует, что при удалении записей на основе максимального количества записей, самые последние использованные будут точными, а по истечении срока действия метка времени будет актуальной.

    Функция updateTimestamp выглядит так:

    (url: string) => {...}

    • URL

      нить

    • возвращает

      Обещание<void>

ExpirationPlugin

Этот плагин можно использовать в workbox-strategy для регулярного применения ограничения на возраст и/или количество кэшированных запросов.

Его можно использовать только с экземплярами workbox-strategy , у которых установлено пользовательское свойство cacheName . Другими словами, его нельзя использовать для истечения срока действия записей в стратегии, которая использует имя кэша времени выполнения по умолчанию.

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

При использовании maxAgeSeconds ответы можно использовать один раз после истечения срока действия, поскольку очистка по истечении срока действия не произойдет до тех пор, пока не будет использован кэшированный ответ. Если ответ имеет заголовок «Дата», то выполняется облегченная проверка срока действия, и ответ не будет использоваться немедленно.

При использовании maxEntries запись, запрошенная последней, будет удалена из кэша первой.

Характеристики

  • конструктор

    пустота

    Функция constructor выглядит так:

    (config?: ExpirationPluginOptions) => {...}

  • удалитьCacheAndMetadata

    пустота

    Это вспомогательный метод, выполняющий две операции:

    • Удаляет все базовые экземпляры Cache, связанные с этим экземпляром плагина, путем вызова метода Cashes.delete() от вашего имени.
    • Удаляет метаданные из IndexedDB, используемые для отслеживания сведений об истечении срока действия для каждого экземпляра кэша.

    При использовании истечения срока действия кэша вызов этого метода предпочтительнее, чем прямой вызов метода caches.delete() , поскольку это гарантирует, что метаданные IndexedDB также будут полностью удалены, а открытые экземпляры IndexedDB будут удалены.

    Обратите внимание: если вы не используете срок действия кеша для данного кеша, вызова caches.delete() и передачи имени кеша должно быть достаточно. В этом случае для очистки не требуется никакого метода, специфичного для Workbox.

    Функция deleteCacheAndMetadata выглядит так:

    () => {...}

    • возвращает

      Обещание<void>

ExpirationPluginOptions

Характеристики

  • параметры совпадения

    CacheQueryOptions необязательно

  • maxAgeSeconds

    номер необязательно

  • maxEntries

    номер необязательно

  • очисткаOnQuotaError

    логическое значение необязательно