Guide pratique pour créer une PWA en 2026

RÉSUMÉ

[Frontend] Construire une PWA en 2026 : Le guide complet

Un guide pas à pas pour développer des Progressive Web Apps performantes et découvrables.

Keywords: PWA, Service Worker, Manifest Web

TABLE DES MATIÈRES

1 Contexte et Introduction : L’Ère des PWA en 2026

2 Anatomie d’une PWA : Composants et Principes Clés

3 Les Service Workers : Le Cœur de la Fiabilité Offline

4 Le Web Manifest : Installer l’Expérience Web

5 Performance et Optimisation : Les Clés du Succès en 2026

6 Résolution des Défis Courants : Mise à Jour et Débogage

7 Guide Pratique : Construire Votre Première PWA

8 Conclusion : L’Avenir Prometteur des PWA

9 FAQ sur les Progressive Web Apps

CONTEXTE

Contexte et Introduction : L’Ère des PWA en 2026

En tant qu’expert en développement frontend, je peux affirmer que l’année 2026 marque une étape cruciale dans l’évolution des applications web. Les attentes des utilisateurs n’ont jamais été aussi élevées : ils désirent des expériences fluides, rapides et fiables, quel que soit l’appareil ou la qualité de la connexion réseau. C’est dans ce contexte que les Progressive Web Apps (PWA) se sont imposées comme une solution incontournable, comblant le fossé entre les applications web traditionnelles et les applications natives.

Depuis leur introduction par Google il y a une décennie, les PWA ont constamment évolué, intégrant les dernières avancées technologiques du web. En 2026, elles ne sont plus une simple « option » mais une véritable « nécessité » pour toute entreprise souhaitant offrir une présence numérique performante et accessible. Elles permettent non seulement d’améliorer l’engagement utilisateur mais aussi d’optimiser les taux de conversion et de réduire les coûts de développement par rapport à la maintenance de multiples plateformes natives.

« Les PWA en 2026 représentent la convergence ultime entre la flexibilité du web et la puissance des applications natives, offrant une expérience utilisateur sans compromis. »

— Kwontenu, Expert Frontend

L’adoption des PWA a explosé, avec des géants comme Twitter, Starbucks, et Forbes qui ont tous rapporté des améliorations significatives de leurs métriques clés après l’implémentation de PWA. Par exemple, Starbucks a vu ses commandes mobiles doubler et le temps d’utilisation de son application PWA augmenter de 23% depuis son lancement. De même, la PWA de Twitter (Twitter Lite) a réduit la taille de l’application de plus de 97% et a augmenté l’engagement de 65%.

POINT CLÉ

Les Progressive Web Apps (PWA) sont des applications web qui exploitent les dernières technologies pour offrir une expérience utilisateur similaire à celle des applications natives : fiables (chargement instantané, même hors ligne), rapides (réactives aux interactions) et engageantes (installables sur l’écran d’accueil, notifications push).

Ce guide complet vous accompagnera pas à pas dans la construction de votre propre PWA en 2026, en couvrant les concepts fondamentaux, les meilleures pratiques, et les outils essentiels. Préparez-vous à transformer vos applications web en expériences exceptionnelles !


ANALYSE DÉTAILLÉE

Anatomie d’une PWA : Composants et Principes Clés

Avant de plonger dans le code, il est essentiel de comprendre ce qui constitue une PWA et les principes qui la rendent si puissante. Une PWA n’est pas une technologie unique, mais un ensemble de technologies web modernes travaillant de concert pour offrir une expérience utilisateur améliorée.

Les Trois Piliers Fondamentaux d’une PWA

Pour qu’une application web soit considérée comme une PWA, elle doit généralement respecter trois principes fondamentaux :

  • Fiable : Elle doit se charger instantanément et fonctionner de manière fluide, même dans des conditions réseau instables ou hors ligne. C’est la promesse d’une expérience sans coupure, rendue possible par les Service Workers et les stratégies de mise en cache.
  • Rapide : Une PWA doit être réactive aux interactions utilisateur, avec des animations fluides et un défilement sans à-coups. Les performances sont cruciales, et cela implique une optimisation rigoureuse des ressources et du code.
  • Engageante : Elle doit offrir une expérience utilisateur immersive, comparable à celle d’une application native. Cela inclut la possibilité d’être installée sur l’écran d’accueil, de recevoir des notifications push, et d’accéder à certaines fonctionnalités matérielles via les API Web.

Les Composants Techniques Essentiels

Ces principes sont concrétisés par plusieurs technologies clés :

  • Service Workers : Ce sont des scripts JavaScript qui s’exécutent en arrière-plan, indépendamment de la page web. Ils agissent comme un proxy réseau programmable, permettant de contrôler la façon dont les requêtes réseau sont gérées. C’est le moteur de la fiabilité et des capacités hors ligne.
  • Manifeste d’Application Web (Web Manifest) : Un fichier JSON qui fournit des informations sur l’application (nom, icônes, start_url, couleur du thème, mode d’affichage). Il permet au navigateur de proposer l’installation de l’application sur l’écran d’accueil de l’utilisateur.
  • HTTPS : Toutes les PWA doivent être servies via HTTPS. C’est une exigence non négociable pour la sécurité, car les Service Workers peuvent intercepter les requêtes réseau, et une connexion sécurisée est primordiale pour prévenir les attaques de type « man-in-the-middle ».
  • Shell d’Application (App Shell) : Une architecture de développement qui sépare le contenu dynamique de l’interface utilisateur statique. Le shell de l’application (en-tête, navigation, etc.) est mis en cache par le Service Worker, permettant un chargement instantané de la structure de base de l’application.

Avantages

Accessibilité Universelle : Une seule base de code pour toutes les plateformes (web, mobile, desktop).

Coût de Développement Réduit : Pas besoin de développer et maintenir des applications natives distinctes pour iOS et Android.

Performance Optimisée : Chargement rapide, même en cas de mauvaise connexion, grâce au caching.

Découvrabilité Améliorée : Référencement par les moteurs de recherche, contrairement aux applications natives.

Mises à Jour Transparentes : Les utilisateurs ont toujours la dernière version sans intervention manuelle.

Engagement Accru : Notifications push, icône sur l’écran d’accueil, mode plein écran.

Inconvénients

Accès Limité aux API Matérielles : Moins d’accès aux fonctionnalités natives spécifiques (ex: contacts, Bluetooth avancé) par rapport aux applications natives, bien que les API Fugu continuent d’évoluer en 2026.

Découverte via App Stores : Moins visible dans les magasins d’applications (bien que cela change avec les listes de PWA dans certains stores).

Support Variable par Navigateur/OS : Des différences peuvent exister dans le support de certaines fonctionnalités PWA entre iOS, Android et les navigateurs desktop.

POINT CLÉ

Une PWA n’est pas une application hybride ; elle est construite avec des technologies web standard et s’exécute directement dans le navigateur, tout en offrant des fonctionnalités natives via des APIs web progressives.


COMPOSANTS CLÉS

Les Service Workers : Le Cœur de la Fiabilité Offline

Les Service Workers sont sans doute la technologie la plus révolutionnaire des PWA. Imaginez un script JavaScript qui vit en dehors de votre page web principale, capable d’intercepter les requêtes réseau, de gérer le cache, et de fournir des fonctionnalités en arrière-plan comme les notifications push. C’est précisément ce que fait un Service Worker.

Cycle de Vie d’un Service Worker

Comprendre le cycle de vie est essentiel pour éviter les pièges et gérer les mises à jour correctement :

  • Enregistrement : Votre page web enregistre le Service Worker (généralement navigator.serviceWorker.register('sw.js')).
  • Installation : Une fois enregistré, le Service Worker télécharge et met en cache les ressources essentielles (le « shell » de l’application). Cet événement install est crucial.
  • Activation : Après l’installation, le Service Worker est activé. C’est le moment idéal pour nettoyer les anciens caches et s’assurer que le nouveau Service Worker prend le contrôle de la page.
  • Fetch : Une fois activé, le Service Worker peut intercepter toutes les requêtes réseau de la page et répondre avec des ressources du cache ou du réseau.

Diagramme du cycle de vie d'un Service Worker montrant les événements d'enregistrement, d'installation, d'activation et de récupération

Stratégies de Mise en Cache

Les stratégies de cache définissent comment le Service Worker gère les requêtes. Les plus courantes en 2026 sont :

  • Cache-First, Network-Fallback : Tente de servir la ressource depuis le cache. Si elle n’est pas trouvée, elle la demande au réseau. Idéal pour les ressources statiques et le shell de l’application.
  • Network-First, Cache-Fallback : Tente de récupérer la ressource depuis le réseau. Si le réseau est indisponible, elle la sert depuis le cache. Utile pour les contenus qui doivent être à jour, mais qui bénéficient d’une option hors ligne.
  • Stale-While-Revalidate : Sert la ressource depuis le cache immédiatement, puis met à jour le cache en arrière-plan avec la version la plus récente du réseau. Excellent pour les contenus qui n’ont pas besoin d’être instantanément à jour mais qui doivent être actualisés rapidement.
  • Cache-Only : Ne sert que depuis le cache. Utilisé pour les ressources critiques du shell qui ne changent jamais.
  • Network-Only : Ne sert que depuis le réseau. Utilisé pour les requêtes qui ne doivent jamais être mises en cache (ex: requêtes d’authentification).

EXPLICATION DU CODE

Ce Service Worker de base met en cache le shell de l’application lors de l’installation et utilise une stratégie « Cache-First » pour les requêtes futures, assurant ainsi un chargement instantané même hors ligne. La liste ASSETS_TO_CACHE contient les fichiers essentiels.

// sw.js (Service Worker)

const CACHE_NAME = 'kwontenu-pwa-cache-v1';
const ASSETS_TO_CACHE = [
  '/',
  '/index.html',
  '/styles.css',
  '/app.js',
  '/images/logo.png',
  '/manifest.json'
];

// Événement 'install' : met en cache les ressources statiques de l'application
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => {
        console.log('[Service Worker] Mise en cache des ressources statiques');
        return cache.addAll(ASSETS_TO_CACHE);
      })
      .then(() => self.skipWaiting()) // Force l'activation du nouveau SW immédiatement
  );
});

// Événement 'activate' : nettoie les anciens caches
self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((cacheNames) => {
      return Promise.all(
        cacheNames.map((cacheName) => {
          if (cacheName !== CACHE_NAME) {
            console.log('[Service Worker] Suppression de l\'ancien cache :', cacheName);
            return caches.delete(cacheName);
          }
        })
      );
    }).then(() => self.clients.claim()) // Prend le contrôle des pages existantes
  );
});

// Événement 'fetch' : intercepte les requêtes réseau
self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then((response) => {
        // Cache-First, Network-Fallback
        if (response) {
          return response; // Si la ressource est dans le cache, la retourner
        }
        return fetch(event.request) // Sinon, la récupérer via le réseau
          .then((networkResponse) => {
            // Optionnel: Mettre en cache les nouvelles ressources du réseau
            // if (networkResponse.ok && event.request.method === 'GET' && event.request.url.startsWith(self.location.origin)) {
            //   const responseToCache = networkResponse.clone();
            //   caches.open(CACHE_NAME).then((cache) => {
            //     cache.put(event.request, responseToCache);
            //   });
            // }
            return networkResponse;
          })
          .catch(() => {
            // Gérer les cas où le réseau est également indisponible
            // Par exemple, retourner une page d'erreur hors ligne
            // return caches.match('/offline.html');
            console.log('[Service Worker] Réseau indisponible pour :', event.request.url);
            return new Response('

Offline Content

', { headers: { 'Content-Type': 'text/html' } }); }); }) ); });

POINT CLÉ

Les Service Workers sont des scripts JavaScript qui s’exécutent en arrière-plan et agissent comme un proxy réseau programmable, permettant une gestion fine du cache et des requêtes pour une expérience hors ligne et des performances accrues.


INSTALLABILITÉ

Le Web Manifest : Installer l’Expérience Web

Au-delà de la fiabilité, une PWA se distingue par son « installabilité ». C’est la capacité d’une application web à être ajoutée à l’écran d’accueil d’un appareil (mobile ou desktop) et à fonctionner comme une application native, sans la barre d’adresse du navigateur. Le Web Manifest est le fichier JSON qui rend cela possible.

Structure et Propriétés Clés du manifest.json

Le fichier manifest.json est un simple fichier texte qui décrit votre PWA au navigateur. Il est lié à votre page HTML via une balise <link rel="manifest" href="/manifest.json">.

Voici les propriétés les plus importantes :

  • name : Le nom complet de votre application, affiché dans les installeurs et les listes d’applications.
  • short_name : Un nom plus court, utilisé lorsque l’espace est limité (par exemple, sous l’icône sur l’écran d’accueil).
  • icons : Un tableau d’objets définissant les icônes de l’application dans différentes tailles et formats. Essentiel pour un affichage correct sur tous les appareils.
  • start_url : L’URL qui est chargée lorsque l’utilisateur lance l’application depuis l’écran d’accueil. Il devrait être une URL relative pour une meilleure portabilité.
  • display : Définit le mode d’affichage préféré de l’application. Les valeurs courantes sont standalone (sans barre d’adresse), fullscreen, minimal-ui ou browser.
  • background_color : La couleur d’arrière-plan de l’écran de démarrage de l’application.
  • theme_color : La couleur du thème de l’application, utilisée par le système d’exploitation pour colorer la barre d’état ou la barre de titre.
  • orientation : Orientation par défaut de l’application (ex: portrait ou landscape).

Diagramme des propriétés du Web Manifest montrant les champs clés et leur objectif

EXPLICATION DU CODE

Ce manifest.json fournit toutes les informations nécessaires pour que le navigateur puisse proposer l’installation de « Kwontenu PWA » sur l’écran d’accueil, avec les icônes appropriées et un affichage autonome.

// manifest.json
{
  "name": "Kwontenu PWA",
  "short_name": "Kwontenu",
  "description": "Un guide complet pour les Progressive Web Apps par Kwontenu.",
  "start_url": "/index.html",
  "display": "standalone",
  "background_color": "#f0f3ff",
  "theme_color": "#667eea",
  "icons": [
    {
      "src": "/images/icons/icon-72x72.png",
      "sizes": "72x72",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-96x96.png",
      "sizes": "96x96",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-128x128.png",
      "sizes": "128x128",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-144x144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-152x152.png",
      "sizes": "152x152",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-384x384.png",
      "sizes": "384x384",
      "type": "image/png"
    },
    {
      "src": "/images/icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

POINT CLÉ

Le Web Manifest est la carte d’identité de votre PWA, permettant aux navigateurs de la « promouvoir » comme une application installable, avec un contrôle précis sur son apparence et son comportement une fois installée.


OPTIMISATION

Performance et Optimisation : Les Clés du Succès en 2026

Une PWA se doit d’être rapide. La performance n’est pas seulement un facteur de classement SEO, c’est une composante essentielle de l’expérience utilisateur. En 2026, avec l’accent mis sur les Core Web Vitals par Google, optimiser la vitesse de votre PWA est plus crucial que jamais.

Les Core Web Vitals et Leur Importance

Les Core Web Vitals sont un ensemble de métriques qui mesurent l’expérience utilisateur réelle d’une page web. Pour les PWA, elles sont particulièrement pertinentes car elles reflètent directement la « rapidité » et la « fiabilité » promises :

  • Largest Contentful Paint (LCP) : Mesure le temps nécessaire pour que le plus grand élément de contenu visible de la page se charge. Un bon LCP doit être inférieur à 2,5 secondes.
  • First Input Delay (FID) : Mesure le temps entre la première interaction de l’utilisateur (clic, tap) et le moment où le navigateur peut répondre à cette interaction. Un bon FID est inférieur à 100 millisecondes. (Note: Le FID est en cours de remplacement par l’Interaction to Next Paint (INP) en 2026, qui mesure la latence de toutes les interactions).
  • Cumulative Layout Shift (CLS) : Mesure la stabilité visuelle de la page. Un bon CLS est inférieur à 0.1.

Des scores faibles sur ces métriques peuvent entraîner une dégradation du classement SEO et une frustration utilisateur, affectant directement l’engagement. Les PWA, par leur nature, sont bien positionnées pour exceller sur ces métriques grâce à la mise en cache agressive et aux stratégies de préchargement.

Techniques d’Optimisation pour 2026

Voici des stratégies avancées pour garantir une PWA ultra-rapide :

  • Lazy Loading : Différez le chargement des images et des vidéos qui ne sont pas immédiatement visibles dans le viewport. Utilisez l’attribut loading="lazy" pour les images et les iframes, ou des bibliothèques JavaScript si nécessaire.
  • Compression des Ressources : Utilisez Gzip ou Brotli pour compresser les fichiers HTML, CSS et JavaScript. Optimisez les images avec des formats modernes comme WebP ou AVIF, et des outils de compression.
  • Utilisation de CDN : Un Content Delivery Network (CDN) distribue vos ressources sur des serveurs géographiquement proches de vos utilisateurs, réduisant ainsi la latence.
  • Pattern PRPL : Ce pattern (Push, Render, Pre-cache, Lazy-load) est une architecture d’optimisation pour les PWA :
    • Push : Envoyez les ressources initiales le plus tôt possible (via HTTP/2 Server Push).
    • Render : Rendez la route initiale rapidement.
    • Pre-cache : Pré-mettez en cache les routes suivantes via un Service Worker.
    • Lazy-load : Chargez en différé le reste des routes et des actifs.
  • Minification du Code : Réduisez la taille des fichiers CSS, JS et HTML en supprimant les espaces blancs, commentaires et caractères inutiles.
  • Code Splitting : Divisez votre bundle JavaScript en plus petits morceaux qui sont chargés à la demande, réduisant ainsi la taille du bundle initial.

Outils d’Audit Indispensables

Google Lighthouse — Un outil open-source intégré à Chrome DevTools qui évalue la performance, l’accessibilité, les bonnes pratiques SEO et la conformité PWA de votre site. Il fournit un rapport détaillé et des recommandations pour améliorer chaque aspect.

WebPageTest — Permet de tester la vitesse de chargement de votre site depuis différents emplacements géographiques et navigateurs, fournissant des cascades de requêtes et des vidéos du chargement.

Chrome DevTools — Offre des fonctionnalités de débogage des Service Workers, d’inspection du cache, de simulation de conditions réseau (offline, 3G lente) et d’audit des performances en temps réel.

Tableau de bord d'optimisation des performances affichant les scores Core Web Vitals et les recommandations

POINT CLÉ

Une PWA performante en 2026 ne se contente pas d’être fonctionnelle ; elle doit offrir une expérience utilisateur « instantanée » et « fluide », mesurée par des métriques comme les Core Web Vitals, et optimisée par des techniques de caching intelligent et de chargement progressif.


RÉSOLUTION DE PROBLÈMES

Résolution des Défis Courants : Mise à Jour et Débogage

Développer des PWA apporte son lot de défis, en particulier autour de la gestion des Service Workers et du débogage. Une mauvaise gestion peut entraîner des incohérences de cache, des versions obsolètes pour les utilisateurs, ou des bugs difficiles à diagnostiquer. Abordons les problèmes les plus fréquents et leurs solutions.

PROBLÈME 01

Les utilisateurs restent bloqués sur une ancienne version de la PWA.

Le Service Worker met en cache les ressources, ce qui est excellent pour la fiabilité. Cependant, un nouveau déploiement de votre application peut ne pas être immédiatement visible par les utilisateurs car leur navigateur sert toujours l’ancienne version depuis le cache du Service Worker. Le cycle de vie du Service Worker exige que l’ancien Service Worker soit désactivé avant que le nouveau ne prenne le contrôle.

SOLUTION — Gérer les mises à jour avec skipWaiting() et clients.claim().

Pour forcer l’activation immédiate d’un nouveau Service Worker et prendre le contrôle des clients existants, vous pouvez utiliser self.skipWaiting() dans l’événement install et self.clients.claim() dans l’événement activate. Cela garantit que les utilisateurs obtiennent la dernière version sans avoir à fermer et rouvrir l’application.

EXPLICATION DU CODE

Ces deux lignes de code, insérées dans les événements install et activate de votre Service Worker, garantissent que le nouveau Service Worker prend le relais immédiatement, sans attendre que toutes les pages dépendantes soient fermées.

// Dans sw.js
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => cache.addAll(ASSETS_TO_CACHE))
      .then(() => self.skipWaiting()) // Permet au nouveau SW de s'activer sans attendre
  );
});

self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((cacheNames) => {
      return Promise.all(
        cacheNames.map((cacheName) => {
          if (cacheName !== CACHE_NAME) {
            return caches.delete(cacheName);
          }
        })
      );
    }).then(() => self.clients.claim()) // Prend le contrôle des pages existantes immédiatement
  );
});

// Événement 'fetch' : intercepte les requêtes réseau
self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then((response) => {
        // Cache-First, Network-Fallback
        if (response) {
          return response; // Si la ressource est dans le cache, la retourner
        }
        return fetch(event.request) // Sinon, la récupérer via le réseau
          .then((networkResponse) => {
            // Optionnel: Mettre en cache les nouvelles ressources du réseau
            // if (networkResponse.ok && event.request.method === 'GET' && event.request.url.startsWith(self.location.origin)) {
            //   const responseToCache = networkResponse.clone();
            //   caches.open(CACHE_NAME).then((cache) => {
            //     cache.put(event.request, responseToCache);
            //   });
            // }
            return networkResponse;
          })
          .catch(() => {
            // Gérer les cas où le réseau est également indisponible
            // Par exemple, retourner une page d'erreur hors ligne
            // return caches.match('/offline.html');
            console.log('[Service Worker] Réseau indisponible pour :', event.request.url);
            return new Response('

Offline Content

', { headers: { 'Content-Type': 'text/html' } }); }); }) ); });

PROBLÈME 02

Difficulté à déboguer les Service Workers et les problèmes de cache.

Les Service Workers s’exécutent en arrière-plan, ce qui peut rendre leur débogage plus complexe que celui du JavaScript traditionnel. Les problèmes de cache peuvent être insidieux, entraînant des comportements inattendus ou des données obsolètes.

SOLUTION — Utiliser les Chrome DevTools efficacement.

Les outils de développement de Chrome (et d’autres navigateurs) sont vos meilleurs alliés. Le panneau « Application » est particulièrement utile. Vous pouvez y voir tous les Service Workers enregistrés, leur état, les caches qu’ils gèrent (section « Cache Storage »). Vous pouvez également simuler le mode hors ligne, mettre à jour, désenregistrer ou arrêter un Service Worker pour tester différents scénarios.

Pour les problèmes de cache, vérifiez toujours le panneau « Network » en mode « Disable cache » ou « Offline » pour voir si les requêtes sont servies par le Service Worker ou par le réseau.

Onglet Application des Chrome DevTools montrant les Service Workers et le Cache Storage

POINT CLÉ

Une compréhension approfondie du cycle de vie des Service Workers et une utilisation experte des outils de développement sont essentielles pour gérer les mises à jour et déboguer efficacement les PWA, garantissant ainsi une expérience utilisateur toujours à jour et sans accroc.


APPLICATION PRATIQUE

Guide Pratique : Construire Votre Première PWA

Il est temps de passer à la pratique ! Suivez ce guide étape par étape pour construire une PWA simple mais fonctionnelle. Nous allons créer une page web de base, y ajouter un Service Worker et un Web Manifest.

1

Création de la Structure du Projet

Commencez par créer une structure de fichiers simple pour votre PWA. Vous aurez besoin d’un fichier HTML principal, d’un fichier CSS pour le style, et d’un répertoire pour les icônes du manifeste. Créez un dossier images/icons et placez-y des icônes de différentes tailles (au moins 192×192 et 512×512).

EXPLICATION DU CODE

Ce fichier index.html est la base de notre PWA. Notez les liens vers styles.css, manifest.json et app.js (qui enregistrera le Service Worker).

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ma Première PWA Kwontenu</title>
    <link rel="stylesheet" href="styles.css">
    <link rel="manifest" href="manifest.json">
    <meta name="theme-color" content="#667eea">
</head>
<body>
    <header>
        <h1>Bienvenue sur ma PWA Kwontenu !</h1>
    </header>
    <main>
        <p>Ceci est le contenu de votre Progressive Web App. <b>Elle fonctionne même hors ligne !</b></p>
        <button id="fetchDataBtn">Charger des données (simulées)</button>
        <div id="dataOutput" style="margin-top: 20px; padding: 15px; border: 1px solid #e9ecef; border-radius: 8px; background-color: #f8f9fa;">
            <p>Les données chargées apparaîtront ici.</p>
        </div>
    </main>
    <script src="app.js"></script>
</body>
</html>

2

Enregistrement du Service Worker

Nous allons maintenant créer le fichier app.js qui enregistrera notre Service Worker (sw.js). Ce script doit être exécuté par la page principale.

EXPLICATION DU CODE

Ce script app.js vérifie si les Service Workers sont supportés par le navigateur. Si c’est le cas, il enregistre sw.js. Il inclut également une simulation de chargement de données pour démontrer la capacité hors ligne.

// app.js
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker enregistré avec succès :', registration);
})
.catch(error => {
console.error('Échec de l\'enregistrement du Service Worker :', error);
});
});
}

// Simulation de chargement de données
document.getElementById('fetchDataBtn').addEventListener('click', async () => {
const dataOutput = document.getElementById('dataOutput');
dataOutput.innerHTML = '<