Einsatzgebiet und Zweck: Was sind PWAs und wie können sie eingesetzt werden?
Integration: Wie bekomme ich meine erste Progressive Web App?
Debugging: Wie funktioniert die Fehlersuche?
Erkenntnisse aus dem Einsatz: Was sind die Fallstricke bei der Verwendung?
3. VORTRAG
AGENDA PROGRESSIVE WEB APPS
‣ Einsatzgebiet und Zweck
Was sind PWAs und wie können sie eingesetzt werden?
‣ Integration
Wie bekomme ich meine erste Progressive Web App?
‣ Debugging
Wie funktioniert die Fehlersuche?
‣ Erkenntnisse aus dem Einsatz
Was sind die Fallstricke bei der Verwendung?
6. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
VORTEILE
Progressive Responsive Verbindungs-
unabhängig
Natives
Look & Feel
Sicher Verlinkbar
7. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
Quelle: https://developers.google.com/web/fundamentals/architecture/app-shell
8. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
GRUNDSATZ: APP(LICATION) SHELL
▸ Einfaches Designkonzept um mit HTML, CSS und JavaScript eine
Benutzeroberfläche zu realisieren
▸ Anforderungen
▸ Minimales Grundgerüst, individuell cachebar
▸ Natives App-Empfinden
▸ Sparsame Datennutzung
Quelle: https://developers.google.com/web/fundamentals/architecture/app-shell
9. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
GRUNDSATZ: SERVICE WORKERS
▸ Im Hintergrund laufendes JavaScript
▸ Ermöglicht
▸ Offline-Nutzung
▸ Push-Benachrichtigungen
▸ Inhaltsaktualisierung
▸ Content Caching / Fetching
▸ Inhaltsmanipulation
10. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
GRUNDSATZ: APP MANIFEST
▸ Einfache JSON-Datei
▸ Ermöglicht Installation auf dem Homescreen über den Browser
▸ Bietet eine „App-ähnliche“ Benutzerumgebung
11. PROGRESSIVE WEB APPS – EINSATZGEBIET UND ZWECK
FUNKTIONEN
▸ Offline-Zugriff auf bereits besuchte Seiten und
Darstellung einer Offline-Seite
▸ Leistungssteigerung durch lokales Speichern von Ressourcen
▸ Nutzung browserspezifischer Funktionen, z. B. Push-Benachrichtigungen
14. PROGRESSIVE WEB APPS – INTEGRATION
VORAUSSETZUNGEN
▸ HTTPS
Service Worker benötigen eine verschlüsselte Verbindung
▸ /manifest.json
Titel und Beschreibung der PWA, Icons,
Farben und Art der Browser-Darstellung
▸ /sw.js
Service Worker zur Steuerung der PWA
15. PROGRESSIVE WEB APPS – INTEGRATION
MANIFEST.JSON
Möglich:
‣ standalone
‣ minimal-ui
{
"name": "Sebastian Blum GmbH",
"short_name": "sblum",
"description": "Sebastian Blum GmbH aus Zolling in der Nähe von München",
"lang": "de",
"start_url": "./",
"display": "standalone",
"orientation": "any",
"background_color": "#fafafa",
"theme_color": "#9b348e",
"icons": [
{
"src": "icon-64x64.png",
"sizes": "64x64",
"type": "image/png"
},
{ ... }
]
}
16. PROGRESSIVE WEB APPS – INTEGRATION
HTML INTEGRATION
Ist kein Service Worker registriert
→ Installation nach dem Aufruf
<link rel="manifest" href="/manifest.json">
<script>
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("sw.js");
}
</script>
19. PROGRESSIVE WEB APPS – INTEGRATION
PHASE 1: INSTALLATION
Konstanten für
‣ Cache-Namen
‣ Offline-URL
const VERSION = "1.0";
const CACHE_VERSION = "sblum-offline-v" + VERSION;
const OFFLINE_URL = "/offline";
let cacheablePages = [
"/",
"/offline",
"/css/public.css",
"/fonts/font-awesome/fontawesome-webfont.woff2",
"/img/header/homepage.jpg",
"/img/logo/logo.svg",
"/js/public.js"
];
// Pre-Cache all cacheable pages
self.addEventListener("install", event => {
event.waitUntil(caches.open(CACHE_VERSION)
.then(cache => {
return cache.addAll(cacheablePages);
})
.then(() => {
return self.skipWaiting();
})
);
});
Bei Seitenaufruf zu
cachende Seiten
20. PROGRESSIVE WEB APPS – INTEGRATION
PHASE 2: ACTIVATE
Veraltete
Caches leeren
// Cleanup old cache storages
self.addEventListener("activate", event => {
event.waitUntil(
caches.keys()
.then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (CACHE_VERSION !== cacheName) {
return caches.delete(cacheName);
}
})
);
})
);
});
Ist bereits ein Service Worker installiert und aktiviert
→ Überspringen der Phasen 1 und 2
21. PROGRESSIVE WEB APPS – INTEGRATION
PHASE 3: FETCH / MESSAGE
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request)
.then(response => {
if (response) {
return response;
}
// Version #1: Cache all (!) responses and return error page
// Clone the request
let fetchRequest = event.request.clone();
(…)
Service Worker wartet auf Fetch-Event
Kann die Response aus dem Cache-Storage bedient werden?
Version 1: Der Request wird geklont, sein HTTP-Statuscode geprüft
und die Antwort im Cache-Storage für zukünftige Anfragen gespeichert
23. PROGRESSIVE WEB APPS – INTEGRATION
PHASE 3: FETCH / MESSAGE
(…)
// Version #2: Return error page
return fetch(event.request)
.catch(() => {
return caches.match(OFFLINE_URL);
});
})
Version 2: Den Request wieder an den Online-Server weitergeben
Sollte die Antwort fehlerhaft sein (offline oder Server-Fehler)
wird automatisch die Offline-Seite ausgeliefert.
24. PROGRESSIVE WEB APPS – INTEGRATION
PHASE 4: REDUNDANT
▸ Stoppen des Service Workers, wenn
▸ Die Installation fehlschlägt
▸ Die Aktivierung fehlschlägt
▸ Ein neuer Service Worker vorhanden ist
26. PROGRESSIVE WEB APPS – DEBUGGING
GOOGLE CHROME
Application » Manifest
‣ Interpretation der „manifest.json”
27. PROGRESSIVE WEB APPS – DEBUGGING
GOOGLE CHROME
Application » Service Worker
‣ Status des Service Workers
‣ Neuinstallation über „Update on reload”
‣ Entfernen über „Unregister”
28. PROGRESSIVE WEB APPS – DEBUGGING
GOOGLE CHROME
Application » Clear Storage
‣ Löschen aller Elemente der aktuellen PWA
29. PROGRESSIVE WEB APPS – DEBUGGING
GOOGLE CHROME
Application » Cache Storage
‣ Übersicht der Cache Storages
‣ Details zu den gecacheten Dateien
30. PROGRESSIVE WEB APPS – DEBUGGING
AUDITS
▸ Prüfung der PWA auf Optimierungspotential
▸ Open-Source Tool Lighthouse
▸ Testen grundlegender Bedingungen
▸ Registrierung des Service Workers
▸ Auslieferung über HTTPS
▸ Testen zusätzlicher Funktionen (Offline-Seite, Splash-Screen etc.)
Nutzung über die Kommandozeile
NPM-Paket → GoogleChrome/lighthouse
32. PROGRESSIVE WEB APPS – DEBUGGING
SERVICE WORKER NACHTRÄGLICH ENTFERNEN
if ("serviceWorker" in navigator) {
navigator.serviceWorker.getRegistrations().then(registrations => {
for (let registration of registrations) {
registration.unregister();
}
});
}
Fehler im Service Worker?
Ein Entfernen ist zum Glück möglich.
34. PROGRESSIVE WEB APPS – ERKENNTNISSE
PROGRESSIVE ARBEITEN
▸ Nicht beim ersten Rollout alles integrieren
▸ Caching überlegt einsetzen
▸ Update-Strategie entwickeln
35. VIELEN DANK
FÜR EURE AUFMERKSAMKEIT
Sebastian Blum
sb@sblum.de
Präsentation auf der Website
https://www.sblum.de/seocampixx