C'est à dire ?
<script type="text/javascript">
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js', { scope: '/' })
.then(function(reg) {
mainMessage('notify', 'Service worker is started');
}).catch(function(error) {
mainMessage('alert', 'Registration failed with ' + error);
});
} else {
mainMessage('alert', 'Your browser do not support Service Worker');
}
</script>
page.html :
const CACHE_NAME = 'sw-demo_1';
const urlsToCache = ['/index.html'];
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => cache.addAll(urlsToCache))
.then(() => self.skipWaiting())
);
});
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys()
.then(keys => {
return Promise.all(keys
.filter(key => key !== CACHE_NAME)
.map(key => caches.delete(key))
);
})
.then(() => self.clients.claim())
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
fetch(event.request)
.catch(() => caches.match(event.request))
);
});
service-worker.js :
navigator.serviceWorker.register('service-worker.js', { scope: '/' })
1 - Le service worker est lancé dans un processus indépendant de celui de la page web
2 - Tout le code du service worker est asynchrone
return Promise.all(keys [...]);
3 - Le service worker a un cycle de vie : install -> activate -> fetch
4 - Le service worker a accès à un mécanisme de cache
caches.open(CACHE_NAME)
5 - Le service worker ne marche qu'en https
6 - Un dernier point ... que nous verrons plus tard
Tout d'abord, lorsqu'un service worker est démarré, il commence sa phase d'installation. Lors de cette phase, le développeur va pouvoir indiquer un certain nombre d'éléments à sauvegarder dans le cache, par exemple :
Le cache est une simple "base de donnée" clé/valeur : la clé est l'url, la valeur est ce qui est retourné par le serveur (du html, du css, une image ...).
const urlsToCache = [
'/index.html',
'/playlist.html',
'/css/sw-demo.css',
'/images/catWorker.jpg',
'/covers/xeniaRubinos.jpg',
'/js/sw-demo.js',
];
Une fois le service worker installé et activé, il va pouvoir écouter toutes les requêtes effectuées par le navigateur vers le serveur.
La stratégie la plus simple pour permettre à un site de s'afficher hors-ligne va consister à :
1 - Demander au service worker de mettre l'intégralité du site en cache lors de l'installation
2 - Ne rien faire si la requête envoyée au serveur est retournée sans erreur.
3 - En cas de retour en erreur du serveur (ou de non réponse), demander au service worker de retourner la valeur en cache correspondant à cette requête.
https://sw.alexisjanvier.space
Code de la démo : https://github.com/marmelab/service-worker-demo
https://github.com/bahmutov/todomvc-express-and-service-worker
<script type="text/javascript">
if ('serviceWorker' in navigator) { ...
Une Progressive Web App utilise les possibilités du web moderne pour délivrer une expérience utilisateur similaire à une application native. – Progressive Web Apps
Frances Berriman et Alex Russell définissent 9 caractéristiques pour une progressive web app
Avec tous ces points, dont les technos sont disponibles, on peut donc faire des applications pouvant se passer des stores pour être distribuées.
Le service worker est vraiment un outil très puissant et très flexible.
Mais son absence de support sur IE et Safari est un vrai problème.
Donc si :
- vous avez les conditions permettant d'imposer les navigateurs,
- un budget suffisant pour investir sur une partie seulement de vos utilisateurs,
- une volonté d'être avant-gardiste,
Sinon, cela reste pour le moment difficile à vendre à un client.
www.meetup.com/CaenCamp
@caencamp