È abbastanza comune applicare limitazioni a una cache in termini di quanto a lungo dovrebbe consentire l'archiviazione degli elementi in una cache o di quanti elementi devono essere conservati in una cache. Workbox fornisce questa funzionalità tramite il plug-in workbox-expiration
che consente di limitare il numero di voci in una cache e / o rimuovere le voci che sono state memorizzate nella cache per un lungo periodo di tempo.
Limita il numero di voci nella cache
Per limitare il numero di voci archiviate in una cache, puoi utilizzare l'opzione maxEntries
in questo modo:
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,
}),
],
})
);
In questo modo, il plugin verrà aggiunto a questa route. Dopo aver utilizzato una risposta memorizzata nella cache o aver aggiunto una nuova richiesta alla cache, il plug-in controlla la cache configurata e si assicura che il numero di voci memorizzate nella cache non superi il limite. In caso affermativo, le voci meno recenti verranno rimosse.
Limita l'età delle voci memorizzate nella cache
Per limitare il periodo di tempo durante il quale una richiesta viene memorizzata nella cache, puoi definire un'età massima in secondi utilizzando l'opzione maxAgeSeconds
, in questo modo:
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,
}),
],
})
);
Il plug-in controlla e rimuove le voci dopo ogni richiesta o aggiornamento della cache.
Utilizzo avanzato
Se vuoi utilizzare una logica di scadenza separata da qualsiasi altro modulo di Workbox, puoi farlo con la classe CacheExpiration
.
Per applicare limitazioni a una cache, devi creare un'istanza di CacheExpiration
per la cache che vuoi controllare in questo modo:
import {CacheExpiration} from 'workbox-expiration';
const cacheName = 'my-cache';
const expirationManager = new CacheExpiration(cacheName, {
maxAgeSeconds: 24 * 60 * 60,
maxEntries: 20,
});
Ogni volta che aggiorni una voce memorizzata nella cache, devi chiamare il metodo updateTimestamp()
in modo che la relativa età venga aggiornata.
await openCache.put(request, response);
await expirationManager.updateTimestamp(request.url);
Ogni volta che vuoi far scadere un insieme di voci, puoi chiamare il metodo expireEntries()
, che forzerà l'applicazione della configurazione di maxAgeSeconds
e maxEntries
.
await expirationManager.expireEntries();
Tipi
CacheExpiration
La classe CacheExpiration
consente di definire una scadenza e / o un limite per il numero di risposte archiviate in un Cache
.
Proprietà
-
costruttore
void
Per creare una nuova istanza CacheExpiration devi fornire almeno una delle proprietà
config
.La funzione
constructor
ha il seguente aspetto:(cacheName: string, config?: CacheExpirationConfig) => {...}
-
cacheName
stringa
Nome della cache a cui applicare le limitazioni.
-
config
CacheExpirationConfig facoltativo
-
returns
-
-
elimina
void
Rimuove l'archivio di oggetti IndexedDB utilizzato per tenere traccia dei metadati di scadenza della cache.
La funzione
delete
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
-
-
expireEntries
void
Scade le voci per la cache e i criteri specificati.
La funzione
expireEntries
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
-
-
isURLExpired
void
Può essere utilizzato per verificare se un URL è scaduto o meno prima di essere utilizzato.
Ciò richiede una ricerca da IndexedDB, quindi può essere lento.
Nota: questo metodo non rimuoverà la voce memorizzata nella cache. Chiamata
expireEntries()
per rimuovere le voci indicizzate e cache.La funzione
isURLExpired
ha il seguente aspetto:(url: string) => {...}
-
url
stringa
-
returns
Promise<boolean>
-
-
updateTimestamp
void
Aggiorna il timestamp per l'URL specificato. In questo modo, quando rimuovi le voci in base al numero massimo di voci, utilizzato più di recente è preciso o, alla scadenza, il timestamp è aggiornato.
La funzione
updateTimestamp
ha il seguente aspetto:(url: string) => {...}
-
url
stringa
-
returns
Promise<void>
-
ExpirationPlugin
Questo plug-in può essere utilizzato in un workbox-strategy
per applicare regolarmente un limite relativo all'età e / o al numero di richieste memorizzate nella cache.
Può essere utilizzato solo con le istanze workbox-strategy
che hanno un
set di proprietà cacheName
personalizzato.
In altre parole, non può essere utilizzato per far scadere le voci nella strategia che utilizza il nome predefinito della cache di runtime.
Ogni volta che una risposta memorizzata nella cache viene utilizzata o aggiornata, questo plug-in esamina la cache associata e rimuove le risposte vecchie o aggiuntive.
Quando utilizzi maxAgeSeconds
, le risposte possono essere utilizzate una volta dopo la scadenza
perché la pulizia della scadenza verrà eseguita solo dopo l'utilizzo della risposta
memorizzata nella cache. Se la risposta ha un'intestazione "Data", viene eseguito un controllo di scadenza ridotto e la risposta non verrà utilizzata immediatamente.
Quando utilizzi maxEntries
, la voce richiesta meno di recente viene prima rimossa dalla cache.
Proprietà
-
costruttore
void
La funzione
constructor
ha il seguente aspetto:(config?: ExpirationPluginOptions) => {...}
-
config
ExpirationPluginOptions facoltativo
-
returns
-
-
deleteCacheAndMetadata
void
Si tratta di un metodo helper che esegue due operazioni:
- Elimina tutte le istanze di cache sottostanti associate a questa istanza plug-in chiamando caches.delete() per tuo conto.
- Elimina i metadati da IndexedDB utilizzati per tenere traccia dei dettagli della scadenza per ogni istanza Cache.
Quando utilizzi la scadenza della cache, è preferibile chiamare questo metodo piuttosto che chiamare direttamente
caches.delete()
, poiché in questo modo si garantisce che anche i metadati IndexedDB vengano rimossi in modo pulito e le istanze IndexedDB aperte vengono eliminate.Tieni presente che se non utilizzi la scadenza per una determinata cache, dovrebbero essere sufficienti chiamate a
caches.delete()
e trasmissione del nome della cache. In questo caso, non è necessario un metodo specifico di Workbox per la pulizia.La funzione
deleteCacheAndMetadata
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
ExpirationPluginOptions
Proprietà
-
matchOptions
CacheQueryOptions facoltativo
-
maxAgeSeconds
numero facoltativo
-
maxEntries
numero facoltativo
-
purgeOnQuotaError
booleano facoltativo