STANDARD WEB • SANS INSTALLATION • TOUS DEVICES

Progressive Web App

Une PWA est une application web qui adopte des comportements d'application native — installation sur l'Ă©cran d'accueil, fonctionnement hors-ligne, notifications push — sans passer par un store et sans installer de runtime supplĂ©mentaire.

Standard W3C / WHATWG
Popularisé par Google (2015)
Runtime Le navigateur
Taille bundle ~0 Ko Ă  installer
Windows macOS Linux Android iOS ChromeOS
01

Définition & concept

Une Progressive Web App est un site web qui respecte un ensemble de critĂšres techniques lui permettant d'ĂȘtre installĂ© comme une application native sur n'importe quel device (PC, Mac, smartphone, tablette) — directement depuis le navigateur, sans passer par l'App Store ou Google Play.

Le terme "Progressive" signifie que l'application fonctionne pour tous les utilisateurs, quel que soit le navigateur, en offrant des fonctionnalités améliorées progressivement selon les capacités du navigateur et de l'appareil.

🌐
Exemples de PWA connues : Twitter/X, Pinterest, Uber, Starbucks, Google Maps, Spotify Web Player, Microsoft 365, Figma (partiellement), Squoosh, VS Code pour le Web — toutes fonctionnent hors-ligne ou partiellement sans connexion.
CritĂšreSite web classiquePWAApp native
Installation requiseNonNon (optionnelle)Oui (store)
Hors-ligneNonOui (Service Worker)Oui
AccÚs systÚmeTrÚs limitéLimité (APIs web)Complet
PlateformesToutesToutesUne par build
Mises à jourInstantanéesInstantanéesVia store
DécouverteSEO, partage URLSEO + install promptApp Store seulement
02

Historique & évolution

2007 — Steve Jobs & les "web apps"

Lors du lancement de l'iPhone, Steve Jobs suggĂšre que les dĂ©veloppeurs crĂ©ent des "web apps" pour iPhone au lieu d'apps natives. L'idĂ©e est prĂ©maturĂ©e — les navigateurs mobiles ne sont pas assez puissants.

2014 — Service Workers

Le W3C spĂ©cifie les Service Workers — scripts qui s'exĂ©cutent en arriĂšre-plan, permettant le cache, le mode hors-ligne, et les notifications push. C'est la brique fondamentale des PWA.

2015 — Le terme "PWA" est inventĂ©

Frances Berriman et Alex Russell (Google Chrome) forgent le terme "Progressive Web App" dans un article de blog. Chrome implémente les premiÚres APIs.

2017–2018 — Adoption massive Android

Google pousse les PWA dans Chrome Android et le Play Store. Twitter Lite et Pinterest PWA démontrent des gains de performance spectaculaires (jusqu'à 65% de sessions en plus).

2018 — iOS 11.3 : Safari supporte les Service Workers

Apple intĂšgre les Service Workers dans Safari, dĂ©bloqu les PWA sur iPhone et iPad. Support partiel — pas de notifications push sur iOS pendant 5 ans.

2021 — Project Fugu (Google)

Google lance Project Fugu pour combler le fossé entre PWA et apps natives : accÚs au systÚme de fichiers, Bluetooth, NFC, clipboard avancé, badging
 Des dizaines d'APIs sont standardisées.

2023 — iOS 16.4 : Push Notifications

Apple ajoute les notifications push pour les PWA installĂ©es sur iOS — 5 ans aprĂšs Android. Les PWA sur iPhone deviennent enfin viables pour les usages nĂ©cessitant des alertes.

2024+ — Capabilities croissantes

File System Access, Web Bluetooth, WebUSB, WebNFC, Badging API, WebCodecs, WebGPU — les PWA accĂšdent Ă  des fonctionnalitĂ©s de plus en plus proches des apps natives. Edge et Chrome supportent l'installation PWA sur desktop.

03

Les 3 piliers techniques

Une PWA repose sur trois technologies obligatoires. Sans l'une d'elles, elle ne peut pas ĂȘtre considĂ©rĂ©e comme une vraie PWA.

🔒
HTTPS

Connexion sécurisée obligatoire. Les Service Workers refusent de s'enregistrer sur HTTP (sauf localhost pour le développement).

⚙
Service Worker

Script proxy entre le navigateur et le réseau. GÚre le cache, le hors-ligne, les mises à jour en arriÚre-plan.

📋
Web App Manifest

Fichier JSON qui dĂ©finit le nom, l'icĂŽne, les couleurs, l'orientation — permet l'installation et la prĂ©sence sur l'Ă©cran d'accueil.

â„č
CritĂšres Google Lighthouse : Pour ĂȘtre reconnue comme PWA installable, une application doit passer les audits Lighthouse : HTTPS actif, Service Worker avec fetch handler, Manifest avec les champs requis (name, icons 192px et 512px, start_url, display).
04

Web App Manifest

Le fichier manifest.json (ou manifest.webmanifest) décrit l'application au navigateur : comment elle s'affiche une fois installée.

MANIFEST.JSON — COMPLET
{
  "name": "Mon Application",
  "short_name": "MonApp",          // nom sur l'écran d'accueil
  "description": "Description de l'app",
  "start_url": "/",                   // page ouverte au lancement
  "scope": "/",
  "display": "standalone",          // sans barre de navigateur
  "orientation": "portrait",

  "theme_color": "#7c3aed",         // couleur barre de statut
  "background_color": "#f0f4f8", // écran de démarrage

  "icons": [
    { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png",
      "purpose": "any maskable" }  // maskable = icĂŽne adaptative Android
  ],

  "screenshots": [               // miniatures dans le prompt d'installation
    { "src": "/screens/desktop.png", "sizes": "1280x800", "form_factor": "wide" },
    { "src": "/screens/mobile.png",  "sizes": "390x844",  "form_factor": "narrow" }
  ],

  "shortcuts": [               // raccourcis depuis l'icĂŽne (appui long Android)
    { "name": "Nouveau document", "url": "/new" }
  ],

  "share_target": {           // recevoir des fichiers partagés depuis d'autres apps
    "action": "/share", "method": "POST",
    "enctype": "multipart/form-data",
    "params": { "files": [{ "name": "fichiers", "accept": ["image/*"] }] }
  }
}
HTML — RÉFÉRENCER LE MANIFEST
<head>
  <link rel="manifest" href="/manifest.json">
  <meta name="theme-color" content="#7c3aed">
  <!-- iOS (Safari ne lit pas le manifest pour ces tags) -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
</head>
05

Service Worker — Cache & Offline

Le Service Worker est un script JavaScript qui s'exĂ©cute en arriĂšre-plan, sĂ©parĂ© de la page. Il intercepte toutes les requĂȘtes rĂ©seau et peut les servir depuis un cache local.

SW.JS — STRATÉGIE CACHE-FIRST
const CACHE_NAME = 'monapp-v1'
const ASSETS = ['/', '/index.html', '/app.css', '/app.js', '/icons/icon-192.png']

// Installation : mise en cache des assets statiques
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS))
  )
})

// Activation : nettoyage des anciens caches
self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(keys => Promise.all(
      keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))
    ))
  )
})

// Fetch : Cache-First avec fallback réseau
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(cached => {
      return cached || fetch(event.request).then(response => {
        const clone = response.clone()
        caches.open(CACHE_NAME).then(c => c.put(event.request, clone))
        return response
      })
    }).catch(() => caches.match('/offline.html'))
  )
})

Stratégies de cache

StratégieComportementCas d'usage
Cache FirstCache → RĂ©seau si absentAssets statiques (CSS, JS, images)
Network FirstRĂ©seau → Cache si offlineDonnĂ©es dynamiques (API, articles rĂ©cents)
Stale While RevalidateCache immédiat + revalidation asyncContenu mis à jour fréquemment
Cache OnlyCache uniquement, jamais réseauAssets d'installation critique
Network OnlyRéseau uniquement, jamais cacheAnalytics, logs, POST critique
â„č
Workbox (Google) : La bibliothÚque officielle qui génÚre automatiquement le Service Worker avec les bonnes stratégies selon le type de ressource. Intégré dans Vite (vite-plugin-pwa), Next.js, Create React App.
06

APIs Web modernes

Grùce au projet Fugu et aux standards W3C, les PWA accÚdent à des fonctionnalités de plus en plus proches des apps natives :

Push Notifications
✔ Chrome/Edge/FF/iOS 16.4+

Notifications systĂšme, mĂȘme app fermĂ©e. Requiert permission explicite.

File System Access API
⚠ Chrome/Edge seulement

Lire et écrire des fichiers locaux avec dialogue de sélection. Pas de Firefox/Safari.

Background Sync
⚠ Chrome/Edge/Android

Synchroniser des données en arriÚre-plan quand la connexion revient.

Web Share API
✔ Tous navigateurs modernes

Partager du contenu via la feuille de partage native du systĂšme.

Geolocation
✔ Universel

GPS/localisation avec permission. Précision variable selon device.

Camera / Microphone
✔ Universel (HTTPS)

AccÚs caméra et micro via getUserMedia(). Permission obligatoire.

Web Bluetooth
⛔ Chrome/Edge desktop

Connexion à des périphériques Bluetooth LE. Limité et expérimental.

IndexedDB
✔ Universel

Base de données locale NoSQL. Stockage structuré cÎté client, multi-Go possible.

Web NFC
⛔ Chrome Android seulement

Lire/écrire des tags NFC depuis Android Chrome.

Badging API
⚠ Chrome/Edge/Safari

Afficher un badge numérique sur l'icÎne de l'app installée.

Screen Wake Lock
✔ Chrome/Safari/Firefox

EmpĂȘcher l'Ă©cran de se verrouiller pendant l'utilisation.

WebCodecs / WebGPU
⚠ Chrome/Edge 2024+

Encodage/décodage vidéo natif et accÚs GPU pour calcul et rendu haute performance.

07

Installation A2HS & Desktop

Add to Home Screen (A2HS) est le mĂ©canisme par lequel une PWA peut ĂȘtre installĂ©e sur l'Ă©cran d'accueil d'un mobile ou dans les applications du bureau.

JAVASCRIPT — PROMPT D'INSTALLATION PERSONNALISÉ
let installPrompt = null

// Capturer l'événement avant qu'il s'affiche automatiquement
window.addEventListener('beforeinstallprompt', (e) => {
  e.preventDefault()
  installPrompt = e
  document.getElementById('btn-install').style.display = 'block'
})

// Déclencher manuellement depuis un bouton "Installer l'app"
document.getElementById('btn-install').addEventListener('click', async () => {
  if (!installPrompt) return
  installPrompt.prompt()
  const { outcome } = await installPrompt.userChoice
  console.log(outcome === 'accepted' ? 'App installée !' : 'Refusé')
  installPrompt = null
})
PlateformeMécanismeDéclencheur
Android ChromeBanniÚre native + beforeinstallpromptAutomatique ou bouton personnalisé
iOS SafariManuel via "Partager → Ajouter Ă  l'Ă©cran d'accueil"Indice visuel dans l'app recommandĂ©
Chrome / Edge DesktopIcĂŽne ⊕ dans la barre d'adresseBouton personnalisĂ© ou automatique
Samsung InternetBanniĂšre nativeAutomatique
Firefox DesktopPas d'installation PWAN/A
08

Performance — Lighthouse

Google Lighthouse est l'outil de référence pour auditer une PWA. Une PWA "exemplaire" vise des scores élevés sur tous les axes :

100
PERFORMANCE
100
ACCESSIBILITY
100
BEST PRACT.
100
SEO
✔
PWA BADGE

Métriques Core Web Vitals

MétriqueSignificationCible
LCP — Largest Contentful PaintTemps avant affichage du contenu principal< 2.5s
INP — Interaction to Next PaintRĂ©activitĂ© aux interactions utilisateur< 200ms
CLS — Cumulative Layout ShiftStabilitĂ© visuelle (pas de sauts de mise en page)< 0.1
FCP — First Contentful PaintTemps avant premier pixel visible< 1.8s
TTFB — Time to First ByteVitesse de rĂ©ponse du serveur< 800ms
09

Compatibilité par navigateur

Chrome 67+
✔ COMPLET
Support PWA le plus complet
Edge 79+
✔ COMPLET
Basé sur Chromium, identique
Safari iOS 16.4+
✔ BON
Push notif, offline, install
Safari iOS <16.4
⚠ PARTIEL
Sans push, sans certain APIs
Firefox 68+
✔ BON
SW + cache, pas d'install
Samsung Internet
✔ BON
Basé Chromium, bon support
Chrome Android
✔ COMPLET
Meilleure exp. mobile PWA
IE 11
✘ AUCUN
Zéro support Service Worker
10

Limitations vs apps natives

LimitationStatut 2025Alternative
AccÚs filesystem completChrome/Edge seulement (File System Access)Téléchargement + input file
Bluetooth / USB / NFCChrome desktop/Android partiellementApplication native
Capteurs (accéléromÚtre, gyro)Mobile Chrome/Safari, limitéReact Native, app native
Push iOS (avant 16.4)Résolu depuis iOS 16.4 (mars 2023)App native si iOS <16.4 requis
Exécution en arriÚre-planBackground Sync, pas d'exécution longueApp native pour tùches longues
Présence dans les storesPossible via PWABuilder (Microsoft Store)App native packagée
AccÚs contacts / calendrierNon disponible (sauf Contact Picker limité)App native
Performance GPU intensiveWebGPU disponible en 2024+ (Chromium)App native pour jeux, ML
⚠
Safari / iOS : le maillon faible : Apple a longtemps freiné l'adoption des PWA sur iOS pour protéger l'App Store. En 2024, sous pression réglementaire (DMA européen), Apple a amélioré le support, mais reste en retard sur Chromium pour les APIs avancées.
11

PWA vs Electron vs Tauri

CritĂšrePWAElectronTauri
Mobile (iOS/Android)OUI (natif)NONBETA (v2)
InstallationSans storeInstalleurInstalleur
AccÚs systÚmeTrÚs limitéCompletComplet
Taille distribuée0 Ko (URL)~150 Mo~5 Mo
Hors-ligneService WorkerCompletComplet
Mises à jourInstantanéesVia auto-updaterVia plugin updater
SEO / partage URLOUINONNON
AccÚs filesystem completNON (limité)OUIOUI
Courbe d'apprentissageFaibleModĂ©rĂ©eÉlevĂ©e (Rust)
Hébergement requisOUI (HTTPS)NonNon
12

Cas d'usage appropriés

Cas d'usagePertinenceRaison
App web existante Ă  "appifier"EXCELLENTAjouter install + offline Ă  un site web existant en quelques jours.
App universelle tous devicesEXCELLENTUn seul code pour PC, Mac, Android, iOS sans build séparé.
Application à déploiement zero-frictionEXCELLENTURL = distribution. Pas d'installeur, pas de store, pas de MAJ forcée.
Contenu offline (lectures, docs)TRÈS BONService Worker + IndexedDB = expérience offline complÚte.
Dashboard / outil métier interneTRÈS BONAccÚs navigateur uniquement, pas d'installation IT requise.
Outil nĂ©cessitant l'accĂšs complet aux fichiersINSUFFISANTFilesystem limitĂ© — prĂ©fĂ©rer Electron ou Tauri.
App systĂšme, pilotes, bas niveauIMPOSSIBLELe bac Ă  sable web interdit tout accĂšs systĂšme bas niveau.
Application de conversion vidĂ©o lourdeLIMITÉWebCodecs + WebAssembly possible, mais accĂšs fichiers limitĂ© hors Chrome.
🌐
Conclusion : La PWA est le meilleur choix quand l'universalitĂ© prime sur l'accĂšs systĂšme — une app utilisĂ©e sur PC au bureau ET sur smartphone en dĂ©placement, sans installation, distribuĂ©e par une simple URL. C'est la seule technologie de ce comparatif qui fonctionne nativement sur les 6 grandes plateformes simultanĂ©ment. Pour l'accĂšs complet au systĂšme, Tauri (lĂ©ger) ou Electron (mĂ»r) restent nĂ©cessaires.