È abbastanza comune voler applicare limitazioni a una cache in termini di tempo
per cui consentire l'archiviazione degli elementi o di quanti elementi devono essere conservati
in una cache. Workbox fornisce questa funzionalità tramite il plug-inworkbox-expiration
che consente di limitare il numero di voci in una cache e / o rimuovere le voci memorizzate nella cache per un lungo periodo di tempo.
Limita il numero di voci della cache
Per limitare il numero di voci memorizzate in una cache, puoi utilizzare l'opzione
maxEntries
nel seguente 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 plug-in verrà aggiunto a questo percorso. Dopo che viene utilizzata una risposta memorizzata nella cache o viene aggiunta una nuova richiesta alla cache, il plug-in esaminerà la cache configurata e si assicurerà che il numero di voci memorizzate nella cache non superi il limite. In questo caso, le voci meno recenti verranno rimosse.
Limitare la data delle voci memorizzate nella cache
Per limitare il tempo di memorizzazione nella cache di una richiesta, puoi definire un'età massima in secondi utilizzando l'opzione maxAgeSeconds
nel seguente 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 controllerà e rimuoverà le voci dopo ogni richiesta o aggiornamento della cache.
Utilizzo avanzato
Se vuoi utilizzare la logica di scadenza separatamente da qualsiasi altro modulo 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 nel seguente 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);
Poi, ogni volta che vuoi che un insieme di voci scada, puoi chiamare il metodo expireEntries()
che applicherà la configurazione maxAgeSeconds
e maxEntries
.
await expirationManager.expireEntries();
Tipi
CacheExpiration
La classe CacheExpiration
consente di definire una scadenza e / o un limite al numero di risposte memorizzate in un Cache
.
Proprietà
-
Costruttore
nullo
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
nullo
Rimuove l'object store IndexedDB utilizzato per tenere traccia dei metadati relativi alla scadenza della cache.
La funzione
delete
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
-
-
expireEntries
nullo
Scade le voci per la cache e i criteri specificati.
La funzione
expireEntries
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
-
-
isURLExpired
nullo
Può essere utilizzato per verificare se un URL è scaduto o meno prima che venga utilizzato.
Questa operazione richiede una ricerca da IndexedDB, pertanto può essere lenta.
Nota: questo metodo non rimuove la voce memorizzata nella cache. Chiama
expireEntries()
per rimuovere le voci di indexedDB e della cache.La funzione
isURLExpired
ha il seguente aspetto:(url: string) => {...}
-
url
stringa
-
returns
Promise<boolean>
-
-
updateTimestamp
nullo
Aggiorna il timestamp per l'URL specificato. In questo modo, la rimozione delle voci in base al numero massimo di voci, la più utilizzata è accurata o la 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 all'età e / o al numero di richieste memorizzate nella cache.
Può essere utilizzato solo con 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 della cache di runtime predefinito.
Ogni volta che viene utilizzata o aggiornata una risposta memorizzata nella cache, questo plug-in controlla 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 non avverrà dopo l'utilizzo della risposta memorizzata nella cache. Se la risposta contiene un'intestazione "Data", viene eseguito un controllo di scadenza leggero e la risposta non verrà utilizzata immediatamente.
Quando utilizzi maxEntries
, la voce richiesta meno di recente verrà rimossa prima dalla cache.
Proprietà
-
Costruttore
nullo
La funzione
constructor
ha il seguente aspetto:(config?: ExpirationPluginOptions) => {...}
-
config
ExpirationPluginOptions facoltativo
-
returns
-
-
deleteCacheAndMetadata
nullo
Questo è un metodo di supporto che esegue due operazioni:
- Consente di eliminare tutte le istanze di cache sottostanti associate a questa istanza del plug-in chiamando caches.delete() per tuo conto.
- Elimina i metadati da IndexedDB utilizzati per tenere traccia dei dettagli di scadenza per ogni istanza della cache.
Quando utilizzi la scadenza della cache, è preferibile chiamare questo metodo anziché chiamare direttamente
caches.delete()
, poiché in questo modo verrà garantita anche la rimozione corretta dei metadati IndexedDB e l'eliminazione delle istanze IndexedDB aperte.Tieni presente che se non utilizzi la scadenza della cache per una determinata cache, chiamare
caches.delete()
e passare il nome della cache dovrebbe essere sufficiente. In questo caso, non è necessario alcun metodo specifico di Workbox per la pulizia.La funzione
deleteCacheAndMetadata
ha il seguente aspetto:() => {...}
-
returns
Promise<void>
ExpirationPluginOptions
Proprietà
-
matchOptions
CacheQueryOptions facoltativo
-
maxAgeSeconds
number facoltativo
-
maxEntries
number facoltativo
-
purgeOnQuotaError
booleano facoltativo