Français

Apprenez à utiliser les service workers pour créer des applications web offline-first qui sont rapides, fiables et engageantes pour les utilisateurs du monde entier.

Service Workers : Créer des Applications Web Offline-First

Dans le monde d'aujourd'hui, les utilisateurs s'attendent à ce que les applications web soient rapides, fiables et accessibles, même lorsque la connectivité réseau est limitée ou indisponible. C'est là que le concept de conception "offline-first" (priorité à l'hors-ligne) entre en jeu. Les service workers sont une technologie puissante qui permet aux développeurs de créer des applications web qui fonctionnent de manière transparente hors ligne, offrant une expérience utilisateur supérieure.

Que sont les Service Workers ?

Un service worker est un fichier JavaScript qui s'exécute en arrière-plan, séparé du thread principal du navigateur. Il agit comme un proxy entre l'application web et le réseau, interceptant les requêtes réseau et gérant la mise en cache. Les service workers peuvent gérer des tâches telles que :

Il est important de noter que les service workers sont contrôlés par le navigateur, et non par la page web. Cela leur permet de fonctionner même lorsque l'utilisateur a fermé l'onglet ou la fenêtre du navigateur.

Pourquoi l'approche Offline-First ?

Créer une application web offline-first offre de nombreux avantages :

Comment fonctionnent les Service Workers

Le cycle de vie d'un service worker se compose de plusieurs étapes :

  1. Enregistrement (Registration) : Le service worker est enregistré auprès du navigateur, en spécifiant la portée de l'application qu'il contrôlera.
  2. Installation : Le service worker est installé, phase durant laquelle il met généralement en cache les ressources statiques.
  3. Activation : Le service worker est activé et prend le contrôle de l'application web. Cela peut impliquer de désenregistrer les anciens service workers et de nettoyer les anciens caches.
  4. Inactif (Idle) : Le service worker reste inactif, en attente de requêtes réseau ou d'autres événements.
  5. Récupération (Fetch) : Lorsqu'une requête réseau est effectuée, le service worker l'intercepte et peut soit servir le contenu mis en cache, soit récupérer la ressource depuis le réseau.

Mettre en œuvre l'Offline-First avec les Service Workers : Un guide étape par étape

Voici un exemple de base sur la manière de mettre en œuvre la fonctionnalité offline-first à l'aide des service workers :

Étape 1 : Enregistrer le Service Worker

Dans votre fichier JavaScript principal (par ex., `app.js`) :


if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(function(registration) {
      console.log('Service Worker enregistré avec la portée :', registration.scope);
    })
    .catch(function(error) {
      console.log('Échec de l'enregistrement du Service Worker :', error);
    });
}

Ce code vérifie si le navigateur prend en charge les service workers et enregistre le fichier `service-worker.js`. La portée définit les URL que le service worker contrôlera.

Étape 2 : Créer le fichier Service Worker (service-worker.js)

Créez un fichier nommé `service-worker.js` avec le code suivant :


const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/style.css',
  '/app.js',
  '/images/logo.png'
];

self.addEventListener('install', function(event) {
  // Effectuer les étapes d'installation
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('Cache ouvert');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Ressource trouvée dans le cache - retourner la réponse
        if (response) {
          return response;
        }

        // IMPORTANT : Cloner la requête.
        // Une requête est un flux et ne peut être consommée qu'une seule fois. Comme nous la consommons
        // une fois par le cache et une fois par le navigateur pour la récupération, nous devons cloner la réponse.
        var fetchRequest = event.request.clone();

        return fetch(fetchRequest).then(
          function(response) {
            // Vérifier si nous avons reçu une réponse valide
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

            // IMPORTANT : Cloner la réponse.
            // Une réponse est un flux et ne doit être consommée qu'une seule fois.
            var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
    );
});

self.addEventListener('activate', function(event) {

  var cacheWhitelist = [CACHE_NAME];

  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

Ce code effectue les actions suivantes :

Étape 3 : Tester votre fonctionnalité hors ligne

Pour tester votre fonctionnalité hors ligne, vous pouvez utiliser les outils de développement du navigateur. Dans Chrome, ouvrez les DevTools, allez dans l'onglet "Application", et sélectionnez "Service Workers". Vous pouvez ensuite simuler le mode hors ligne en cochant la case "Offline".

Techniques avancées de Service Worker

Une fois que vous avez une compréhension de base des service workers, vous pouvez explorer des techniques plus avancées pour améliorer votre application offline-first :

Stratégies de mise en cache

Il existe plusieurs stratégies de mise en cache que vous pouvez utiliser, en fonction du type de ressource et des exigences de votre application :

Le choix de la bonne stratégie de mise en cache dépend de la ressource spécifique et des exigences de votre application. Par exemple, les ressources statiques comme les images et les fichiers CSS sont souvent mieux servies avec la stratégie Cache First, tandis que le contenu dynamique pourrait bénéficier de la stratégie Network First ou Cache then Network.

Synchronisation en arrière-plan

La synchronisation en arrière-plan vous permet de différer des tâches jusqu'à ce que l'utilisateur dispose d'une connexion réseau stable. C'est utile pour des tâches telles que la soumission de formulaires ou le téléchargement de fichiers. Par exemple, un utilisateur dans une région reculée d'Indonésie pourrait remplir un formulaire en étant hors ligne. Le service worker peut alors attendre qu'une connexion soit disponible avant de soumettre les données.

Notifications Push

Les service workers peuvent être utilisés pour envoyer des notifications push aux utilisateurs, même lorsque l'application n'est pas ouverte. Cela peut être utilisé pour réengager les utilisateurs et fournir des mises à jour opportunes. Pensez à une application d'actualités fournissant des alertes de dernière minute aux utilisateurs en temps réel, que l'application soit activement en cours d'exécution ou non.

Workbox

Workbox est une collection de bibliothèques JavaScript qui facilitent la création de service workers. Il fournit des abstractions pour les tâches courantes telles que la mise en cache, le routage et la synchronisation en arrière-plan. L'utilisation de Workbox peut simplifier votre code de service worker et le rendre plus facile à maintenir. De nombreuses entreprises utilisent désormais Workbox comme un composant standard lors du développement de PWA et d'expériences offline-first.

Considérations pour un public mondial

Lors de la création d'applications web offline-first pour un public mondial, il est important de prendre en compte les facteurs suivants :

Exemples d'applications Offline-First

Plusieurs applications web populaires ont mis en œuvre avec succès la fonctionnalité offline-first à l'aide de service workers :

Conclusion

Les service workers sont un outil puissant pour créer des applications web offline-first qui sont rapides, fiables et engageantes. En mettant en cache les ressources, en interceptant les requêtes réseau et en gérant les tâches en arrière-plan, les service workers peuvent offrir une expérience utilisateur supérieure, même lorsque la connectivité réseau est limitée ou indisponible. Comme l'accès au réseau reste inégal à travers le monde, se concentrer sur des conceptions offline-first est crucial pour garantir un accès équitable à l'information et aux services sur le web.

En suivant les étapes décrites dans ce guide et en tenant compte des facteurs mentionnés ci-dessus, vous pouvez créer des applications web qui fonctionnent de manière transparente hors ligne et offrent une expérience agréable aux utilisateurs du monde entier. Adoptez la puissance des service workers et construisez l'avenir du web – un avenir où le web est accessible à tous, partout, quelle que soit leur connexion réseau.