--- title: Utiliser Application Cache slug: Web/HTML/Utiliser_Application_Cache tags: - Avancé - Cache - Déprécié - Guide - HTML - appcache translation_of: Web/HTML/Using_the_application_cache ---
Attention ! L'utilisation de la fonction de mise en cache d'application décrite ici est actuellement fortement déconseillée; cette fonctionnalité est en train d' être retiré de la plate-forme Web. Utiliser Service Workers à la place. En fait, à partir de Firefox 44, quand l'application cache est utilisé pour fournir une aide hors ligne pour une page, un message d'avertissement est maintenant affiché dans la console conseillant aux développeurs d'utiliser Service workers à la place ({{bug("1204581")}}).
HTML5 supporte la mise en cache hors-ligne de ressources d'applications web; les fichiers sont stockés dans l'Application Cache (AppCache) - une collection de ressources obtenues depuis un fichier manifest (*.appcache
) inclue dans une application web.
L'utilisation d'une application cache permet les bénéfices suivants :
Vous devez, pour utiliser le cache d'application, utiliser l'attribut manifest
dans l'élément <html>
comme suit :
<html manifest="example.appcache"> ... </html>
L'attribut manifest
spécifie l'URI d'un manifeste de cache, qui est un fichier texte qui répertorie les ressources (fichiers) que le navigateur doit mettre en cache pour votre application.
Vous devez inclure l'attribut manifest
sur chaque page de votre application que vous souhaitez mettre en cache. Le navigateur met pas en cache les pages qui ne contiennent pas l'attribut manifest
, sauf si celle-ci sont explicitement mentionnées dans le manifeste même. Vous ne devez pas lister toutes les pages que vous souhaitez mettre en cache dans le fichier manifeste, le navigateur ajoute implicitement chaque page que l'utilisateur visite et qui possède l'attribut manifest
réglé sur le cache de l'application.
Certains navigateurs dont Firefox vont avertir l'utilisateur la première fois que celui-ci charge votre application par une notification :
« Ce site internet (www.example.com
) veut stocker des données sur votre ordinateur pour une utilisation hors-ligne. [Accepter] [Refuser pour ce site] [Pas maintenant] ».
Le terme « d'applications (fonctionnant) hors-ligne » est parfois utilisé pour désigner les applications que l'utilisateur a autorisé à travailler hors-ligne.
L'utilisation d'un cache de l'application modifie le processus normal de chargement d'un document :
Le procédé de chargement de documents et mise à jour du cache de l'application est définie de manière plus détaillée ci-dessous:
manifest
et qu'il n'existe pas encore de cache d'application, il chargera le document puis récupérera toutes les entrées listées dans le manifeste, créant ainsi la première version du cache d'application.checking
à l'objet window.applicationCache
, puis récupère le manifeste en fonction de la règle de cache HTTP adéquate.noupdate
est envoyé a l'applicationCache
, et le processus de mise à jour est terminé. C'est la raison pour laquelle vous devez changer le manifeste chaque fois que vous mettez à jour les ressources sur le serveur, afin que le navigateur sache qu'il doit de nouveau récupérer les ressources.applicationCache.add()
) sont récupérés dans un cache temporaire, en fonction des règles de cache HTTP adéquates. Un évènement progress
est envoyé à l'objet applicationCache
chaque fois qu'un fichier est récupéré dans le cache temporaire. Un évènement error
est envoyé à chaque erreur, et la mise à jour s'arrête.cached
est envoyé à l'objet applicationCache
. Le document étant déjà chargé dans le navigateur depuis le cache, le document mis à jour ne sera pas ré-affiché tant que celui-ci n'est pas chargé à nouveau (que ce soit manuellement ou via un programme).Dans Chrome, le cache hors-ligne peut être effacé grâce au bouton "Effacer les données de navigation..." dans les préférences, ou en ouvrant chrome://appcache-internals/
. Safari a un paramètre "Vider le cache" dans ses préférences, mais il est possible que le redémarrage du navigateur soit nécessaire.
Dans Firefox, les données de cache hors-ligne sont stockées séparément du profil Firefox—à côté du cache disque normal :
C:\Users\<username>\AppData\Local\Mozilla\Firefox\Profiles\<salt>.<profile name>\OfflineCache
/Users/<username>/Library/Caches/Firefox/Profiles/<salt>.<profile name>/OfflineCache
Dans Firefox l'état actuel du cache hors-ligne est consultable sur la page about:cache
(dans la section "Offline cache device"). Le cache hors-ligne peut être effacé pour chaque site individuellement à l'aide du boutton "Supprimer..." dans Menu -> Options -> Avancé -> Réseau -> Contenu web et données utilisateur hors connexion.
Avant Firefox 11, ni Tools -> Clear Recent History ni Tools -> Options -> Advanced -> Network -> Offline data -> Clear Now ne permettaient d'effacer le cache hors-ligne. Ceci a été corrigé.
Voir aussi effacer les données de stockage DOM.
Les caches d'application peuvent aussi devenir obsolètes. Si le manifeste d'une application est retiré du serveur, le navigateur efface toutes les données cachées utilisant ce manifeste, et déclenche un event "obsoleted" à l'objet applicationCache
. Le statut du cache de l'application est alors OBSOLETE
.
L'attribut manifest
dans une application web peut spécifier le chemin relatif d'un manifeste de cache ou une URL absolue. (Les URL absolues doivent être de la même origine que l'application). Le manifeste du cache peut avoir une extension de fichier, mais il doit être servi avec le MIME type text/cache-manifest
.
AddType text/cache-manifest .appcache
à un fichier a .htaccess soit à l'intérieur du répertoire racine, soit le même répertoire que l'application.Le fichier manifest de cache est un simple fichier de texte qui liste les ressources que le navigateur doit cache pour l'accès hors ligne. Les ressources sont identifiées par URI. Les entrées listées dans le manifeste de cache doivent avoir le même plan, hôte, et port comme un manifest.
Ci-dessous, un exemple simple de manifeste — example.appcache
utilisé par le site imaginaire www.example.com:
CACHE MANIFEST # v1 - 2011-08-13 # Ceci est un commentaire. https://www.example.com/index.html https://www.example.com/header.png https://www.example.com/blah/blah
Il n'y a pas, dans cet exemple, d'en-tête de section, donc toutes les lignes sont supposées être des sections (CACHE:
) explicites. On peut aussi utiliser des URL relatives (index.html
, …)
Le commentaire « v1 » n'est pas là par hasard : le cache n'est mis à jour que quand le manifeste change, avec une correspondance d'octet à octet. Si vous utilisez d'autres ressources (par exemple en mettant à jour le contenu de l'image header.png
), vous devez changer le manifeste pour signaller au navigateur qu'il doit rafraîchir le cache, et, comme header.png
est déjà présent dans le cache, vous devez modifier quelquechose d'autre. Bien que vous puissiez changer n'importe quoi d'autre dans le manifest, utiliser un numéro de version est une bonne pratique conseillée.
CACHE
, NETWORK
, et FALLBACK
Un manifeste peut avoir trois sections distinctes: CACHE
, NETWORK
, et FALLBACK
.
CACHE:
NETWORK:
FALLBACK:
FALLBACK:
section qui spécifie les pages de repli que le navigateur doit utiliser si une ressource est inaccessible. Chaque entrée dans cette section répertorie deux URIs (le premier est la ressource, le second est le repli). Les deux URIs doivent être relatif et de la même origine que le fichier manifeste. Les Wildcards peuvent être utilisés.Les sections CACHE
, NETWORK
, et FALLBACK peuvent être listés dans n'importe quel ordre dans un manifeste de cache, et chaque section peut apparaître plus qu'une fois dans un simple manifeste.
Voici un exemple plus complet de manifeste pour notre site imaginaire www.example.com.
CACHE MANIFEST # v1 2011-08-14 # Ceci est un autre commentaire index.html cache.html style.css image1.png # Contenu Fallback FALLBACK: . fallback.html # L'utilise depuis le network (réseau) si il est disponible NETWORK: network.html
Nous utilisons dans cet exemple les sections FALLBACK
et NETWORK
pour préciser que la page network.html
doit toujours être récupérée depuis le réseau et que la page fallback.html
doit être utilisée comme ressource de secours, par exemple si la connexion au serveur ne peut être établie.
Les manifestes doivent être servis avec le type MIME text/cache-manifest
, et toutes les ressources servies en utilisant ce type MIME doivent respecter la syntaxe d'un manifeste, comme défini ici.
Les manifestes sont des fichiers textes au format UTF-8 et peuvent, éventuellement, inclure un caractère BOM. Les nouvelles lignes peuvent être représentés par saut de ligne (U+000A
), retour chariot (U+000D
), ou les deux.
La première ligne du manifeste doit être la chaine CACHE MANIFEST
(séparé par un simple espace U+0020
), suivi par aucun ou plusieurs espaces ou tabulations. Tout autre texte sur la ligne sera ignoré.
Le reste du manifeste peut contenir 0 ou plusieurs lignes :
#
, suivi de 0 ou plusieurs caractères de texte. Les commentaires devraient être utilisés seulement sur leur propre ligne, et ne devrait pas être ajoutés à d'autres lignes. Cela signifie également que vous ne pouvez pas spécifier les identifiants de fragments.section header
précise la section du cache qui est manipulée. Il en existe trois types:
Section header Description CACHE:
Passe à la section explicite. C'est la section par défaut. NETWORK:
Passe à la section des sections en ligne sur la liste blanche. FALLBACK:
Passe à la section de secours.
CACHE:
) chaque ligne contient une référence URI ou IRI à une ressource en cache (aucun caractère joker n'est admis dans cette section). Des espaces sont accepté avant et après l'URI on l'IRI sur chaque ligne. Dans la section de secours, chaque ligne est une référence URI ou IRI vers une ressource, suivie d'une ressource de secours qui sera utilisée lorsque la connexion au serveur ne peut être établie. Dans la section en ligne, chaque ligne est une référence valide URI ou IRI à une ressource qui sera récupérée sur le réseau (le caractère joker « * » est autorisé dans cette section).
Le manifeste peut passer à l'envie d'une section à l'autre (chaque en-tête de section peut être utilisée plusieurs fois), et les sections vides sont tolérées.
Le cache inclue toujours au moins une ressource, identifiée par URI. Toutes les ressources répondent à une des catégories suivantes :
manifest
.Les catégories ressources sont décrites en détail ci-dessous.
Tous les fichiers HTML peuvent inclure un attribut {{htmlattrxref("manifest","html")}} dans leur élément {{HTMLElement("html")}}. Par exemple, disons que nous avons le fichier https://www.example.com/entry.html
, qui ressemble à ça :
<html manifest="example.appcache"> <h1>Application Cache Example</h1> </html>
Si entry.html
n'est pas inclue dans le manifeste, visiter la page entry.html
provoquera l'ajout de la page entry.html
dans le cache de l'application comme une master entry.
Les entrées explicites sont des ressources explicitement listées dans la section CACHE
d'un manifeste de cache.
Les entrées listées dans NETWORK :
peuvent contenir plusieurs ou aucune ressource que l'application requiert lors d'un accès en ligne. C'est principalement une liste blanche en ligne. Les URIS spécifiées dans la section NETWORK
sont chargées depuis le serveur plutôt que depuis le cache. Cela permet au modèle de sécurité du navigateur de protéger l'utilisateur de possibles brèches de sécurité en limitant l'accès aux seules ressources approuvées.
Vous pouvez l'utiliser pour, par exemple, charger et exécuter des scripts et d'autres codes depuis le serveur au lieu du cache. :
CACHE MANIFEST NETWORK: /api
Ceci assure que les requêtes téléchargent les ressources contenues dans https://www.example.com/api/
viendront toujours du réseau sans essayer d'accéder au cache.
manifest
défini dans l'élément html
) dans le manifeste n'aurait pas le même comportement parce que les master entries seront ajoutées — et donc servies depuis— le cache. Les entrées de fallback sont utilisées quand une tentative de chargement d'une ressource échoue. Par exemple, imaginons qu'il y a un manifeste situé à https://www.example.com/example.appcache
, et qui contient :
CACHE MANIFEST FALLBACK: example/bar/ example.html
Toute requête vers https://www.example.com/example/bar/
ou n'importe lequel de ses sous-répertoires et contenus provoquera une tentative de chargement de la ressource demandée. Si la tentative échoue, soit à cause d'un échec réseau ou d'une erreur serveur quelle qu'elle soit, le contenu du fichier example.html
sera chargé à la place.
Chaque cache a un statut qui indique la condition actuelle du cache. Les caches qui partagent la même URI de manifeste partagent le même statut, qui est un des suivants :
UNCACHED
IDLE
CHECKING
DOWNLOADING
UPDATEREADY
updateready
correspondant, qui est lancé au lieu de l'évènement cached
quand une nouvelle mise à jour a été téléchargée mais pas encore activée via la méthode swapCache()
.OBSOLETE
Vous pouvez programmer un test pour voir si une application possède un manifeste de cache à jour en utilisant JavaScript. Depuis un manifeste de cache peut être été mis à jour avant un script qui teste si les événements sont à jour, les scripts doivent toujours tester window.applicationCache.status
.
function onUpdateReady() { console.log('nouvelle version trouvée !'); } window.applicationCache.addEventListener('updateready', onUpdateReady); if(window.applicationCache.status === window.applicationCache.UPDATEREADY) { onUpdateReady(); }
Pour démarrer manuellement le test pour un nouveau manifeste de cache, vous pouvez utilisez window.applicationCache.update()
.
other-cached-page.html?parameterName=value
). Cela rendra le contournement du navigateur du cache et de tenter de l'obtenir à partir du réseau. Pour créer un lien vers les ressources mises en cache qui ont des paramètres analysés dans les paramètres d'utilisation de JavaScript dans la partie de hach de la liaison, comme other-cached-page.html#whatever?parameterName=value
.window.applicationCache.swapCache()
, si les ressources qui ont déjà été chargées ne seront pas affectés. Pour vous assurer que les ressources sont chargées à partir d'une nouvelle version du cache de l'application, rafraîchir la page est idéal.ExpiresByType text/cache-manifest "access plus 0 seconds"
{{Compat("html.elements.html.manifest")}}