Transformer une application web en quelque chose qu’un utilisateur peut installer demande étonnamment peu de choses : un manifeste qui décrit l’application, un service worker, et des icônes aux bonnes tailles. Le navigateur fait le reste.
La partie difficile n’est pas la plomberie. C’est de décider ce que votre application doit faire quand le réseau n’est pas là.
Le manifeste est une promesse
Déclarer display: standalone retire l’habillage du navigateur. Cela veut dire retirer le bouton de retour, la barre d’adresse et le bouton de rechargement. Si votre application s’appuie sur l’un d’eux, vous venez de la casser, et seulement sur les appareils où elle est installée, c’est à dire là où vous ne testerez pas.
Pareil pour start_url : c’est là que l’application s’ouvre, pas là où l’utilisateur en était. Pointez-la sur quelque chose qui a du sens à froid.
Le hors ligne est une décision produit
Un service worker peut servir depuis le cache, depuis le réseau, ou faire courir les deux. Lequel convient dépend entièrement de la page :
- Polices, icônes, ressources compilées : le cache d’abord. Elles ne changent qu’au déploiement.
- Pages de contenu : le réseau d’abord, le cache en repli. Une page un peu vieille vaut mieux qu’une page d’erreur.
- Tout ce qui porte un prix, un niveau de stock ou une permission : le réseau seulement. Servir une réponse en cache ici est pire que de ne rien servir.
Cette dernière ligne est celle qu’on saute, et c’est celle qui cause de vrais incidents.
Testez-la comme elle échoue
Basculer le navigateur en mode hors ligne n’est pas un vrai test. La panne intéressante est la connexion lente et capricieuse où les requêtes restent suspendues au lieu d’échouer, parce que c’est là qu’une stratégie de cache d’abord sert en silence des données vieilles d’un mois. Bridez plutôt que de déconnecter.
pwa-bundle engendre le manifeste, les icônes et le service worker d’une application Symfony, et vous laisse les décisions de stratégie, là où elles ont leur place.