Structure d'une application web progressive
Qu’est-ce qu’une PWA ?
Une Progressive Web App (PWA) est une application web conçue pour offrir une expérience proche des applications natives tout en conservant les avantages du web : pas d’installation obligatoire via un magasin d’applications, mise à jour instantanée, URL partageable.
Concrètement, une PWA c’est :
- Un site web normal (HTML / CSS / JS),
- Plus un fichier de métadonnées (le manifeste) qui le rend installable,
- Plus un script exécuté en arrière-plan (le Service Worker) qui le rend utilisable hors-ligne.
Le qualificatif « progressive » signifie que l’application fonctionne pour tout le monde mais offre des capacités supplémentaires (installation, notifications, hors-ligne) aux utilisateurs dont le navigateur les supporte.
Les critères d’une PWA
Pour qu’une application soit considérée comme une PWA, elle doit remplir quatre critères fondamentaux :
- Installable — L’utilisateur peut l’ajouter à son écran d’accueil (mobile) ou son bureau (desktop). Cela requiert un manifeste valide.
- Fonctionne hors-ligne — L’application démarre et affiche du contenu même sans connexion. Cela requiert un Service Worker.
- Servie en HTTPS — Obligation absolue : les Service Workers ne s’enregistrent que sur un site HTTPS (ou
localhosten développement). - Responsive et performante — L’interface s’adapte aux écrans et charge rapidement.
Ces quatre critères sont exactement ceux audités par Lighthouse (onglet « PWA » dans Chrome DevTools), que vous utiliserez au projet 2.
Architecture d’une PWA

- L’application : le site React que vous avez construit.
- Le manifeste : un fichier JSON qui décrit le nom, les icônes et le mode d’affichage.
- Le Service Worker (couvert en détail la semaine 6) : un script qui intercepte les requêtes réseau et gère le cache.
- Le Cache API : stockage des ressources pour un accès hors-ligne.
Le manifeste
Le manifeste est un fichier JSON servi avec l’extension .webmanifest (type MIME application/manifest+json). Il donne au navigateur les informations nécessaires pour installer l’application.
Exemple complet
{ "name": "Avis et alertes Montréal", "short_name": "Avis MTL", "description": "Consultez les avis et alertes de la Ville de Montréal", "start_url": "/", "scope": "/", "display": "standalone", "orientation": "portrait", "background_color": "#ffffff", "theme_color": "#bb2649", "lang": "fr-CA", "icons": [ { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } ]}Les champs à connaître
| Champ | Rôle |
|---|---|
name | Nom complet affiché lors de l’installation |
short_name | Nom court affiché sous l’icône (≤ 12 caractères) |
start_url | URL chargée au lancement (typiquement /) |
scope | Portée de l’application (URLs que le SW contrôle) |
display | standalone, fullscreen, minimal-ui ou browser |
background_color | Couleur affichée pendant le chargement initial |
theme_color | Couleur de la barre de statut / onglet |
icons | Tableau d’icônes (au moins 192 et 512 px) |
Icônes : le détail qui compte
Trois types d’icônes sont requis pour une PWA vraiment installable :
- Icône standard (
purpose: "any") — 192×192 et 512×512 PNG. - Icône adaptative (
purpose: "maskable") — 512×512 avec une zone de sécurité (le contenu principal doit tenir dans un cercle au centre). Android découpe cette icône pour l’adapter à la forme du thème (ronde, carrée, goutte…). Sans elle, votre icône peut apparaître avec des bordures blanches disgracieuses. - Icône Apple Touch — 180×180 PNG, référencée depuis le HTML (voir ci-dessous).
Outil pratique pour générer tout ça : PWA Builder.
Lier le manifeste au HTML
Un manifeste n’est jamais chargé automatiquement : il faut le déclarer dans le <head> de votre index.html, avec les métadonnées iOS en complément (Safari ne lit pas tout le manifeste) :
<head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Lien vers le manifeste --> <link rel="manifest" href="/manifest.webmanifest" />
<!-- Couleur du thème (barre d'adresse, barre de statut) --> <meta name="theme-color" content="#bb2649" />
<!-- iOS : Safari ne lit pas complètement le manifeste --> <link rel="apple-touch-icon" href="/icons/apple-touch-icon-180.png" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="default" /> <meta name="apple-mobile-web-app-title" content="Avis MTL" />
<title>Avis et alertes Montréal</title></head>L’invitation à l’installation
Sur Chrome Android et Edge desktop, si votre PWA remplit les critères, le navigateur propose automatiquement une invitation « Ajouter à l’écran d’accueil » via l’événement beforeinstallprompt. Vous pouvez capter cet événement pour l’intercepter et afficher votre propre bouton d’installation.
Sur iOS, il n’y a pas d’invitation automatique : l’utilisateur doit manuellement appuyer sur Partager → Sur l’écran d’accueil. Prévoyez une instruction visible pour guider vos utilisateurs iOS.
Outils recommandés
vite-plugin-pwa
Étant donné qu’on utilise Vite, l’outil standard pour automatiser la génération du manifeste et du Service Worker est vite-plugin-pwa.
npm install -D vite-plugin-pwaimport { defineConfig } from 'vite';import react from '@vitejs/plugin-react';import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({ plugins: [ react(), VitePWA({ registerType: 'autoUpdate', manifest: { name: 'Avis et alertes Montréal', short_name: 'Avis MTL', theme_color: '#bb2649', icons: [ { src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png' }, { src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png' }, { src: '/icons/icon-maskable-512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' }, ], }, }), ],});Le plugin génère automatiquement le manifeste, enregistre un Service Worker basé sur Workbox, et gère la mise à jour.
Lighthouse

Lighthouse (onglet de Chrome DevTools) est l’outil officiel d’audit PWA. Il valide :
- Le manifeste (champs, icônes, scope).
- L’enregistrement du Service Worker.
- La configuration HTTPS.
- La performance globale.
Lancez-le en mode production (npm run build puis npm run preview). En mode développement, les scores sont pénalisés par des optimisations désactivées.
Erreurs communes à éviter
| Erreur | Symptôme | Correction |
|---|---|---|
Pas de <link rel="manifest"> dans l’HTML | Manifeste ignoré | Ajouter la balise dans <head> |
Icône sans variante maskable | Icône avec bordure blanche sur Android | Ajouter une icône 512×512 purpose: "maskable" |
Oubli des balises apple-* | iOS affiche une icône générique | Ajouter apple-touch-icon et apple-mobile-web-app-* |
start_url non accessible hors-ligne | L’app ne démarre pas en avion | Précacher start_url dans le Service Worker |
| Tester Lighthouse en mode dev | Scores artificiellement bas | Toujours auditer le build de production |
| Oubli du HTTPS | Le SW ne s’enregistre pas | Utiliser localhost en dev, HTTPS en prod |
Récapitulatif
- Une PWA est un site web rendu installable et hors-ligne par un manifeste et un Service Worker.
- Quatre critères : installable, hors-ligne, HTTPS, responsive/performante.
- Le manifeste (
manifest.webmanifest) décrit le nom, les icônes et le mode d’affichage. Il doit être lié au HTML. - Les icônes viennent en trois saveurs : standard, maskable (Android), et Apple Touch (iOS).
- iOS nécessite des métadonnées HTML supplémentaires (
apple-*) car Safari ne lit pas tout le manifeste. vite-plugin-pwaautomatise la génération du manifeste et du Service Worker pour les projets Vite.- Lighthouse est l’outil de validation — à lancer en mode production.
Exercices
- Manifeste minimal. Créez un
manifest.webmanifestpour votre projet 1, puis liez-le depuisindex.html. Vérifiez dans Chrome DevTools (onglet Application → Manifest) que les champs sont bien détectés. - Icônes. Générez un jeu complet d’icônes avec RealFaviconGenerator ou maskable.app. Ajoutez-les à votre manifeste et vérifiez le rendu dans la prévisualisation d’installation.
- iOS. Ajoutez les balises
apple-touch-iconetapple-mobile-web-app-*à votre HTML. Testez l’ajout à l’écran d’accueil depuis un iPhone ou un simulateur. - Audit Lighthouse. Lancez un audit Lighthouse (catégorie PWA) sur le build de production de votre projet. Identifiez les points qui bloquent et planifiez les corrections pour la semaine 6.
vite-plugin-pwa. Installez le plugin, migrez votre manifeste dansvite.config.js, et vérifiez que le build génère automatiquement un Service Worker.