Le manifeste du cache du mode hors ligne pour HTML5


La bataille app native VS site responsive va faire rage pendant pas mal de temps, et pour le moment les apps gagnent : performances plus élevées, meilleures intégration visuelle dans l’OS, accès à une API plus riche… Les utilisateurs les préfèrent, et du coup les pros sont obligés de se les coltiner. C’est chiant, mais c’est la réalité du terrain pour les dev sur mobile.

Mais pour les sites Web ou les apps simples, il est super intéressant d’exploiter les capacités HTLM5 au max pour une obtenir une expérience plus “app” et moins “site web”.

Parmi ces possibilités : le mode hors ligne. D’un côté, il y a le stockage des données dans le navigateur, mais on vous en a déjà parlé.

De l’autre, il y a le cache des ressources. Cela consiste à déclarer quels fichiers (html, css, js, images, fonts, n’importe quoi…) garder en mémoire afin de les charger directement depuis le disque dur au lieu de le faire en ligne.

Pour cela, il faut déclarer un manifeste dans son HTML :

<html manifest="cache.manifest">

Ensuite, on créer le fichier cache.manifest dans son projet, qui est un fichier de texte simple.

Il faut le faire servir avec le mime-type

text/cache-manifest

sinon ça ne marche pas. Si vous le nommez

*.manifest

et que vous le servez avec un serveur de dev, ça marchera tout seul. Pour la prod, il faut le spécifier à votre serveur. Par exemple avec nginx, il faut éditer le fichier /etc/nginx/mime.types et y ajouter :

text/cache-manifest                   manifest;

Pour apache, c’est un truc du genre dans le .htaccess:

AddType text/cache-manifest .manifest

Ensuite, le manifeste ressemble à ça :

CACHE MANIFEST
# 2014-04-20 13:25:00

# Toutes les ressources à sauvegarder en local. Le navigateur
# va toujours chercher ces ressources sur le disque.
# Si on est déconnecté, la page index.html, ses styles et javascript
# s'afficheront donc quand même.
CACHE:
index.html
/favicon.ico
stylesheet.css
images/logo.png
scripts/main.js
fonts/font.woff

# Ressources à toujours charger depuis le réseau. On met ici
# une étoile pour dire "tout le reste". Si on ne fait pas ça,
# on va se retrouver sans css et js :)
NETWORK:
*

# Ressources alternatives si les précédentes sont inacessibles.
# Par exemple, pour afficher un point rouge si on est hors ligne
# et un point vert si on est en ligne :
# images/offline.png sera servi si images/online.png est inaccessible
FALLBACK:
images/online.png images/offline.png

Notez le commentaire # 2014-04-20 13:25:00 tout en haut. C’est
une convention qu’on utilise pour donner la dernière date de modification des
fichiers cachés. En effet, les fichiers de la section CACHE ne seront
pas rechargés tant que le manifeste n’a pas été modifié.

Cela veut dire que si vous modifiez index.html, l’utilisateur
ne verra pas la modification. Mais si vous changez la date du fichier manifeste,
le fichier est modifié, et le navigateur rechargera donc toutes les ressources
qu’il a mis en cache. Ainsi, vous permettez aux utilisateurs de voir les
ressources cachées qui ont été modifiées.

12 thoughts on “Le manifeste du cache du mode hors ligne pour HTML5

  • Zanguu

    A noter aussi que le nom du manifeste ne doit pas changer.
    Par exemple si vous avez un “cache_V1.manifest” et que vous le nommez “cache_V2.manifest” :
    – toute personne qui aura récupéré le cache V1 ne verra pas la nouvelle version;
    – tous les nouveaux users utiliseront le cache V2.
    Si après une heure vous vous rendez compte de votre erreur :
    – tous les nouveaux users qui ont récupéré le cache V2 n’auront jamais accès aux mises à jours futures de cache V1 (a moins de se débarrasser du cache bien sûr).

    Dernière info pour le fin, ce genre de manifest est la base d’une appli Firefox OS. Et ça c’est cool !

  • Baptiste

    Et pour un site comme le votre, est-ce que l’on fait un manifest ou est-ce que c’est illusoire/overkill ?
    Et du coup, de quoi le remplis t’on ?

    Cet article est un peu trop théorique à mon gout :D

  • Sam Post author

    Un site comme le notre ? Un blog ? Un site de cul ? Le multiboard ? Zerobin ?

  • jerry wham

    Intéressant. Si j’ai bien compris, le fichier manifest doit être à la racine du projet c’est ça, vu la déclaration du header ?

  • Sam Post author

    Tu peux mettre n’importe quelle URL, relative ou absolue, qui respecte la politique de sécurité de ton navigateur.

  • Luigi

    Ortho :

    Si on est déconnecter => déconnecté
    innacessibles => inaccessibles

  • Cédric

    Bonjour,

    Est-il possible de gérer une mise à jour automatique du fichier manifest en fonction de la date et de l’heure système ?

    Merci d’avance

  • Sam Post author

    Il suffit de faire un process qui réécrit le fichier à l’heure dite (ex un cron).

  • Davy

    Bonjour,

    J’ai réalisé un site de cette façon et je dois le refaire avec de nouvelles contraintes.

    1 ) Je dois pouvoir filtrer les pages que je souhaite afficher avec des cases à cocher. Pour ce faire LocalStorage doit apparemment faire l’affaire.

    2) Je souhaite pouvoir accéder à une vingtaine de fichiers PDF, et là … pas d’idées …pas de solutions trouvées. Même un seul fichier PDF indiqué dans le manifest ne fonctionne pas. J’avais d’ailleurs eu le même problème avec une vidéo. J’ai lu des articles qui parle d’API FILE mais ne semble pas solutionner mon problème.

    Donc, pour faire simple, est-il possible de lire un fichier PDF sur un site hors ligne ?

    Merci pour votre aide

  • Sam Post author

    La mémoire disponible pour une site hors ligne est limitée par nom de domaine. Il me semble que la limite est 5Mo. Donc à mon avis les PDF, zob.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.