data de validade da caixa de trabalho

É bastante comum restringir um cache em termos de quanto tempo ele permite que os itens sejam armazenados ou quantos itens podem ser mantidos em um cache. O Workbox oferece essa funcionalidade pelo plug-in workbox-expiration, que permite limitar o número de entradas em um cache e / ou remover entradas que foram armazenadas em cache por um longo período.

Restringir o número de entradas de cache

Para restringir o número de entradas armazenadas em um cache, use a opção maxEntries da seguinte maneira:

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,
      }),
    ],
  })
);

Com isso, o plug-in será adicionado a essa rota. Depois que uma resposta armazenada em cache é usada ou uma nova solicitação é adicionada ao cache, o plug-in verifica o cache configurado e garante que o número de entradas armazenadas em cache não exceda o limite. Se isso acontecer, as entradas mais antigas serão removidas.

Restringir a idade das entradas em cache

Para restringir o tempo de armazenamento em cache de uma solicitação, defina uma idade máxima em segundos usando a opção maxAgeSeconds da seguinte maneira:

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,
      }),
    ],
  })
);

O plug-in vai verificar e remover entradas após cada solicitação ou atualização do cache.

Uso avançado

Se você quiser usar a lógica de expiração separadamente de qualquer outro módulo do Workbox, faça isso com a classe CacheExpiration.

Para aplicar restrições a um cache, crie uma instância de CacheExpiration para o cache que você quer controlar, assim:

import {CacheExpiration} from 'workbox-expiration';

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

Sempre que você atualizar uma entrada em cache, será necessário chamar o método updateTimestamp() para que a idade dela seja atualizada.

await openCache.put(request, response);

await expirationManager.updateTimestamp(request.url);

Em seguida, sempre que você quiser expirar um conjunto de entradas, chame o método expireEntries(), que vai aplicar a configuração maxAgeSeconds e maxEntries.

await expirationManager.expireEntries();

Tipos

CacheExpiration

A classe CacheExpiration permite definir um prazo de validade e / ou limite no número de respostas armazenadas em um Cache.

Propriedades

  • construtor

    void

    Para criar uma nova instância de CacheExpiration, é necessário fornecer pelo menos uma das propriedades config.

    A função constructor é semelhante a esta:

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

    • cacheName

      string

      Nome do cache a que as restrições serão aplicadas.

    • config

      CacheExpirationConfig opcional

  • excluir

    void

    Remove o repositório de objetos IndexedDB usado para acompanhar os metadados de expiração do cache.

    A função delete é semelhante a esta:

    () => {...}

    • retorna

      Promise<void>

  • expireEntries

    void

    Faz com que as entradas do cache e dos critérios especificados expirem.

    A função expireEntries é semelhante a esta:

    () => {...}

    • retorna

      Promise<void>

  • isURLExpired

    void

    Pode ser usado para verificar se um URL expirou ou não antes de ser usado.

    Isso exige uma pesquisa no IndexedDB, o que pode ser lento.

    Observação: esse método não vai remover a entrada em cache. Chame expireEntries() para remover as entradas de IndexedDB e de cache.

    A função isURLExpired é semelhante a esta:

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

    • url

      string

    • retorna

      Promise<boolean>

  • updateTimestamp

    void

    Atualize o carimbo de data/hora do URL fornecido. Isso garante que, ao remover entradas com base no número máximo, a mais recente seja precisa ou, quando expirar, o carimbo de data/hora esteja atualizado.

    A função updateTimestamp é semelhante a esta:

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

    • url

      string

    • retorna

      Promise<void>

ExpirationPlugin

Esse plug-in pode ser usado em um workbox-strategy para aplicar regularmente um limite à idade e / ou ao número de solicitações em cache.

Ele só pode ser usado com instâncias workbox-strategy que tenham um conjunto de propriedades cacheName personalizado. Em outras palavras, ele não pode ser usado para expirar entradas na estratégia que usa o nome de cache de execução padrão.

Sempre que uma resposta em cache for usada ou atualizada, o plug-in vai procurar no cache associado e remover respostas antigas ou extras.

Ao usar maxAgeSeconds, as respostas podem ser usadas uma vez após o vencimento, porque a limpeza de expiração não ocorre até depois de a resposta em cache ser usada. Se a resposta tiver um cabeçalho "Data", uma verificação de expiração leve será realizada e a resposta não será usada imediatamente.

Ao usar maxEntries, a entrada solicitada menos recentemente será removida do cache primeiro.

Propriedades

  • construtor

    void

    A função constructor é semelhante a esta:

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

  • deleteCacheAndMetadata

    void

    Esse é um método auxiliar que realiza duas operações:

    • Exclui todas as instâncias de cache associadas a essa instância de plug-in, chamando caches.delete() em seu nome.
    • Exclui os metadados do IndexedDB usados para acompanhar os detalhes de expiração de cada instância do cache.

    Ao usar a expiração do cache, é preferível chamar esse método em vez de chamar caches.delete() diretamente, porque isso garante que os metadados do IndexedDB também sejam removidos de forma limpa e que as instâncias abertas do IndexedDB sejam excluídas.

    Se você não estiver usando a expiração de cache para um determinado cache, chamar caches.delete() e transmitir o nome do cache será suficiente. Nesse caso, não é necessário um método específico do Workbox para a limpeza.

    A função deleteCacheAndMetadata é semelhante a esta:

    () => {...}

    • retorna

      Promise<void>

ExpirationPluginOptions

Propriedades

  • matchOptions

    CacheQueryOptions opcional

  • maxAgeSeconds

    número opcional

  • maxEntries

    número opcional

  • purgeOnQuotaError

    booleano opcional