Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Request : propriété cache

Baseline Widely available *

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis janvier 2018.

* Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.

Note : Cette fonctionnalité est disponible via les Web Workers.

La propriété en lecture seule cache de l'interface Request contient le mode de cache de la requête. Elle contrôle la façon dont la requête interagit avec le cache HTTP du navigateur.

Valeur

Une valeur de type RequestCache. Les valeurs disponibles sont :

  • default — Le navigateur recherche une requête correspondante dans son cache HTTP.

    • S'il y a une correspondance et qu'elle est fraîche, elle sera retournée depuis le cache.
    • S'il y a une correspondance mais qu'elle est périmée, le navigateur effectuera une requête conditionnelle vers le serveur distant. Si le serveur indique que la ressource n'a pas changé, elle sera retournée depuis le cache. Sinon, la ressource sera téléchargée depuis le serveur et le cache sera mis à jour.
    • S'il n'y a pas de correspondance, le navigateur effectuera une requête normale et mettra à jour le cache avec la ressource téléchargée.
  • no-store — Le navigateur récupère la ressource depuis le serveur distant sans d'abord consulter le cache, et ne mettra pas à jour le cache avec la ressource téléchargée.

  • reload — Le navigateur récupère la ressource depuis le serveur distant sans d'abord consulter le cache, mais mettra ensuite à jour le cache avec la ressource téléchargée.

  • no-cache — Le navigateur recherche une requête correspondante dans son cache HTTP.

    • S'il y a une correspondance, fraîche ou périmée, le navigateur effectuera une requête conditionnelle vers le serveur distant. Si le serveur indique que la ressource n'a pas changé, elle sera retournée depuis le cache. Sinon, la ressource sera téléchargée depuis le serveur et le cache sera mis à jour.
    • S'il n'y a pas de correspondance, le navigateur effectuera une requête normale et mettra à jour le cache avec la ressource téléchargée.
  • force-cache — Le navigateur recherche une requête correspondante dans son cache HTTP.

    • S'il y a une correspondance, fraîche ou périmée, elle sera retournée depuis le cache.
    • S'il n'y a pas de correspondance, le navigateur effectuera une requête normale et mettra à jour le cache avec la ressource téléchargée.
  • only-if-cached — Le navigateur recherche une requête correspondante dans son cache HTTP. Expérimental

    • S'il y a une correspondance, fraîche ou périmée, elle sera retournée depuis le cache.
    • S'il n'y a pas de correspondance, le navigateur répondra avec un statut 504 Gateway timeout.

    Le mode "only-if-cached" ne peut être utilisé que si le mode de la requête est "same-origin". Les redirections mises en cache seront suivies si la propriété redirect de la requête est "follow" et que les redirections ne violent pas le mode "same-origin".

Exemples

js
// Télécharger une ressource en contournant le cache, pour l'ignorer complètement.
fetch("some.json", { cache: "no-store" }).then((response) => {
  /* consommer la réponse */
});

// Télécharger une ressource en contournant le cache, mais mettre à jour le cache HTTP avec la ressource téléchargée.
fetch("some.json", { cache: "reload" }).then((response) => {
  /* consommer la réponse */
});

// Télécharger une ressource en contournant le cache avec un serveur correctement configuré qui enverra les bons en-têtes ETag et Date et gérera correctement les en-têtes de requête If-Modified-Since et If-None-Match, on peut donc se fier à la validation pour garantir une réponse fraîche.
fetch("some.json", { cache: "no-cache" }).then((response) => {
  /* consommer la réponse */
});

// Télécharger une ressource en pensant à l'économie ! Préférer une réponse en cache même périmée pour économiser la bande passante.
fetch("some.json", { cache: "force-cache" }).then((response) => {
  /* consommer la réponse */
});

// Implémentation naïve client du stale-while-revalidate.
// Préférer une réponse en cache même périmée ; mais mettre à jour si elle est trop ancienne.
// AbortController et signal pour permettre un meilleur nettoyage mémoire.
// En réalité, ce serait une fonction qui prend un chemin et une référence au contrôleur car il faudrait changer la valeur
let controller = new AbortController();
fetch("some.json", {
  cache: "only-if-cached",
  mode: "same-origin",
  signal: controller.signal,
})
  .catch((e) =>
    e instanceof TypeError && e.message === "Failed to fetch"
      ? { status: 504 } // Contournement pour Chrome, qui échoue avec un TypeError
      : Promise.reject(e),
  )
  .then((res) => {
    if (res.status === 504) {
      controller.abort();
      controller = new AbortController();
      return fetch("some.json", {
        cache: "force-cache",
        mode: "same-origin",
        signal: controller.signal,
      });
    }
    const date = res.headers.get("date"),
      dt = date ? new Date(date).getTime() : 0;
    if (dt < Date.now() - 86_400_000) {
      // si plus vieux que 24 heures
      controller.abort();
      controller = new AbortController();
      return fetch("some.json", {
        cache: "reload",
        mode: "same-origin",
        signal: controller.signal,
      });
    }

    // Autres conditions possibles
    if (dt < Date.now() - 300_000)
      // Si c'est plus vieux que 5 minutes
      fetch("some.json", { cache: "no-cache", mode: "same-origin" }); // pas d'annulation ni de valeur de retour.
    return res;
  })
  .then((response) => {
    /* consommer la réponse (éventuellement périmée) */
  })
  .catch((error) => {
    /* Peut être un AbortError/DOMException ou un TypeError */
  });

Spécifications

Specification
Fetch
# ref-for-dom-request-cache②

Compatibilité des navigateurs

Voir aussi