É 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
-
retorna
-
-
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) => {...}
-
config
ExpirationPluginOptions opcional
-
retorna
-
-
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