Les Progressive Web App

Les Progressive Web App

Cette semaine, on va encore améliorer un petit peu notre WebApp de contrôle à distance d'un chauffage que nous avions réalisée il y a quelques semaines. Nous allons transformer cette WebApp en application progressive (PWA), ce qui permet de l’installer comme une application native sous Windows.






Une Progressive Web App (PWA) est une application web qui combine les avantages d’un site internet et d’une application native. Elle s’installe directement depuis un navigateur et peut fonctionner hors ligne grâce au cache. Sous Windows, cela permet de déguiser notre web app en application native. Elle apparait dans le menu Démarrer et tourne dans sa propre fenêtre.

Une PWA est composée de deux éléments. Un manifeste qui décrit l'application et un Service Worker qui est du code JavaScript qui est démarré juste avant l'ouverture de la fenêtre et qui agit un peu comme un proxy.


Le manifeste

La première étape est de réaliser le manifeste qui décrit notre application. Il s’agit d’un simple fichier JSON composé de quelques champs. Il faut au minimum fournir:

  • Le nom de l'application
  • Deux icônes (512px et 192px)
  • L'URL de la page principale
  • Le mode d'affichage (display)


Voici, par exemple, le manifeste de notre application:

{
  "lang": "en-us",
  "name": "Remote heating control",
  "description": "Yoctopuce Remote heating control Example",
  "start_url": "./app.html",
  "orientation": "any",
  "display": "standalone",
  "icons": [
    {
      "type": "image/svg+xml",
      "src": "yocto.svg",
      "sizes": "512x512"
    },
    {
      "type": "image/svg+xml",
      "src": "yocto.svg",
      "sizes": "192x192"
    }
  ]
}



La documentation complète des champs du manifeste est disponible sur MDN.

Enfin il faut ajouter une référence à l'aide du tag link à ce manifeste dans le code de note Web App.

<html lang="en">
<head>
  <link rel="manifest" href="manifest.json">
  ...



Le Service Worker

Un Service Worker est un script exécuté en arrière-plan par le navigateur qui permet de gérer le cache des ressources, d’intercepter les requêtes réseau pour utiliser les versions cachées si le serveur de notre web app est offline. Concrètement, cela permet à la PWA de s’afficher, même sans connectivité internet, au lieu d’afficher une erreur 404.

Lors de l’événement install, le Service Worker ouvre un cache nommé "remote-heating-control" et y enregistre les fichiers utilisés par l'application:

  • la page d’accueil (./app.html)
  • le code JavaScript de l'application (app.min.js)
  • l'icône de la page (yocto.svg).

Cela garantit que ces éléments sont disponibles immédiatement, même sans connexion internet.

Lorsque l'application est démarrée et qu'une ressource est chargée via l’événement fetch, le Service Worker vérifie d’abord si celle-ci est déjà en cache. Si c’est le cas, il la retourne directement. Sinon, il tente de la récupérer depuis le réseau, puis la stocke dans le cache pour les prochaines utilisations.

Voilà le code de notre service worker (fichier sw.js):

const CACHE_NAME = `remote-heating-control`;

// Uses the install event to pre-cache all initial resources.
self.addEventListener('install', event => {
    event.waitUntil((async () => {
        const cache = await caches.open(CACHE_NAME);
        cache.addAll([
            './app.html',
            './app.min.js',
            './yocto.svg'
        ]);
    })());
});

self.addEventListener('fetch', event => {
    event.respondWith((async () => {
        const cache = await caches.open(CACHE_NAME);

        // Gets the resource from the cache.
        const cachedResponse = await cache.match(event.request);
        if (cachedResponse) {
            return cachedResponse;
        } else {
            try {
                // If the resource was not in the cache, tries the network.
                const fetchResponse = await fetch(event.request);
                // Saves the resource in the cache and return it.
                cache.put(event.request, fetchResponse.clone());
                return fetchResponse;
            } catch (e) {
                // The network failed
            }
        }
    })());
});



Il faut ensuite enregistrer ce Service Worker dans le code HTML de notre application web:

<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('./sw.js', {scope: './'});
  }
</script>



Utilisation

Une fois ces modifications effectuées, les navigateurs qui prennent en charge les applications Web progressives affichent une icône permettant d’installer l’application. Par exemple voici la page affichée sur Edge:

La page affichée avec Edge
La page affichée avec Edge


Et Chrome:

La page affichée avec Chrome
La page affichée avec Chrome



Si on clique sur cette icône, le browser propose d'installer l'application localement.

L'installation
L'installation



Une fois installée, l'application est disponible comme n'importe quelle application native. Elle a sa propre fenêtre et sa propre icône dans la barre des tâches. L'application est chargée même si le PC est n'est pas connecté à internet grâce au Service Worker. Dans ce cas, l'application n'arrivera pas à se connecter aux modules Yoctopuce distants, l'interface de l'application est utilisable et un message d'erreur est peut-être affiché correctement.

L'application
L'application



L'application est même affiché dans la liste des application Windows. Malheureusement, il n'est pour l'instant pas possible d'afficher un numéro de version dans cette fenêtre.

La PWA apparaît dans la liste des applications installées
La PWA apparaît dans la liste des applications installées



Conclusion

Les progressive web app permettent de rendre l'utilisation d'application web proche d’une application native. L'installation est très simple et est disponible sur n'importe quel Windows (en utilisant Edge ou Chrome). Et, en bonus, cela permet d'afficher un message d'erreur correctement si la machine n'est pas connectée à internet.

Note: Le code complet de l'application est toujours disponible sur GitHub.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.