Il est assez courant de vouloir imposer des restrictions à un cache en termes de durée pendant laquelle il doit autoriser le stockage d'éléments dans un cache ou du nombre d'éléments à conserver dans un cache. Workbox fournit cette fonctionnalité via le plug-in workbox-expiration
, qui vous permet de limiter le nombre d'entrées dans un cache et / ou de supprimer les entrées qui ont été mises en cache pendant une longue période.
Limiter le nombre d'entrées de cache
Pour limiter le nombre d'entrées stockées dans un cache, vous pouvez utiliser l'option maxEntries
comme suit:
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,
}),
],
})
);
Le plug-in sera alors ajouté à ce parcours. Une fois qu'une réponse mise en cache est utilisée ou qu'une nouvelle requête est ajoutée au cache, le plug-in examine le cache configuré et s'assure que le nombre d'entrées mises en cache ne dépasse pas la limite. Si c'est le cas, les entrées les plus anciennes seront supprimées.
Limiter l'âge des entrées mises en cache
Pour limiter la durée de mise en cache d'une requête, vous pouvez définir une durée maximale en secondes à l'aide de l'option maxAgeSeconds
comme suit:
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,
}),
],
})
);
Le plug-in vérifie et supprime les entrées après chaque requête ou mise à jour du cache.
Utilisation avancée
Si vous souhaitez utiliser la logique d'expiration indépendamment de tout autre module Workbox, vous pouvez le faire avec la classe CacheExpiration
.
Pour appliquer des restrictions à un cache, vous devez créer une instance de CacheExpiration
pour le cache que vous souhaitez contrôler comme suit:
import {CacheExpiration} from 'workbox-expiration';
const cacheName = 'my-cache';
const expirationManager = new CacheExpiration(cacheName, {
maxAgeSeconds: 24 * 60 * 60,
maxEntries: 20,
});
Chaque fois que vous mettez à jour une entrée mise en cache, vous devez appeler la méthode updateTimestamp()
pour que son âge soit mis à jour.
await openCache.put(request, response);
await expirationManager.updateTimestamp(request.url);
Ensuite, chaque fois que vous souhaitez faire expirer un ensemble d'entrées, vous pouvez appeler la méthode expireEntries()
, qui appliquera la configuration maxAgeSeconds
et maxEntries
.
await expirationManager.expireEntries();
Types
CacheExpiration
La classe CacheExpiration
vous permet de définir une expiration et / ou une limite sur le nombre de réponses stockées dans un Cache
.
Propriétés
-
constructor
vide
Pour créer une instance CacheExpiration, vous devez fournir au moins l'une des propriétés
config
.La fonction
constructor
se présente comme suit :(cacheName: string, config?: CacheExpirationConfig) => {...}
-
cacheName
chaîne
Nom du cache auquel appliquer des restrictions.
-
config
CacheExpirationConfig facultatif
-
retours
-
-
supprimer
vide
Supprime le magasin d'objets IndexedDB utilisé pour suivre les métadonnées d'expiration du cache.
La fonction
delete
se présente comme suit :() => {...}
-
retours
Promise<void>
-
-
expireEntries
vide
Expire les entrées pour le cache et les critères donnés.
La fonction
expireEntries
se présente comme suit :() => {...}
-
retours
Promise<void>
-
-
isURLExpired
vide
Permet de vérifier si une URL a expiré avant de l'utiliser.
Cette opération nécessite une recherche dans IndexedDB, ce qui peut être lent.
Remarque: Cette méthode ne supprime pas l'entrée mise en cache. Appelez
expireEntries()
pour supprimer les entrées indexedDB et Cache.La fonction
isURLExpired
se présente comme suit :(url: string) => {...}
-
url
chaîne
-
retours
Promise<boolean>
-
-
updateTimestamp
vide
Mettez à jour le code temporel de l'URL donnée. Cela garantit que lorsque vous supprimez des entrées en fonction du nombre maximal d'entrées, la dernière utilisation est exacte ou que, lors de l'expiration, le code temporel est à jour.
La fonction
updateTimestamp
se présente comme suit :(url: string) => {...}
-
url
chaîne
-
retours
Promise<void>
-
ExpirationPlugin
Ce plug-in peut être utilisé dans un workbox-strategy
pour appliquer régulièrement une limite à l'âge et / ou au nombre de requêtes mises en cache.
Il ne peut être utilisé qu'avec des instances workbox-strategy
qui disposent d'un ensemble de propriétés cacheName
personnalisé.
En d'autres termes, il ne peut pas être utilisé pour faire expirer les entrées d'une stratégie qui utilise le nom de cache d'exécution par défaut.
Chaque fois qu'une réponse mise en cache est utilisée ou mise à jour, ce plug-in examine le cache associé et supprime les réponses anciennes ou supplémentaires.
Lorsque vous utilisez maxAgeSeconds
, les réponses peuvent être utilisées une fois après leur expiration, car le nettoyage d'expiration n'aura lieu qu'après l'utilisation de la réponse mise en cache. Si la réponse comporte un en-tête "Date", une vérification d'expiration légère est effectuée et la réponse n'est pas utilisée immédiatement.
Lorsque vous utilisez maxEntries
, l'entrée la moins récemment demandée est supprimée du cache en premier.
Propriétés
-
constructor
vide
La fonction
constructor
se présente comme suit :(config?: ExpirationPluginOptions) => {...}
-
config
ExpirationPluginOptions facultatif
-
retours
-
-
deleteCacheAndMetadata
vide
Il s'agit d'une méthode d'assistance qui effectue deux opérations:
- Supprime toutes les instances de cache sous-jacentes associées à cette instance de plug-in en appelant caches.delete() en votre nom.
- Supprime les métadonnées d'IndexedDB utilisées pour suivre les détails d'expiration de chaque instance de cache.
Lorsque vous utilisez l'expiration du cache, il est préférable d'appeler cette méthode plutôt que d'appeler directement
caches.delete()
, car cela garantit que les métadonnées IndexedDB sont également supprimées de manière propre et que les instances IndexedDB ouvertes sont supprimées.Notez que si vous n'utilisez pas l'expiration du cache pour un cache donné, appeler
caches.delete()
et transmettre le nom du cache devrait suffire. Dans ce cas, aucune méthode spécifique à Workbox n'est requise pour le nettoyage.La fonction
deleteCacheAndMetadata
se présente comme suit :() => {...}
-
retours
Promise<void>
ExpirationPluginOptions
Propriétés
-
matchOptions
CacheQueryOptions facultatif
-
maxAgeSeconds
number facultatif
-
maxEntries
number facultatif
-
purgeOnQuotaError
booléen facultatif