Progressive Web Apps (PWAs) schließen die Lücke zwischen klassischen Webseiten und nativen Mobilanwendungen. Sie vereinen die Erreichbarkeit des Webs mit der flüssigen Performance und den Hardware-Features nativer Apps. Ob Offline-Fähigkeit, Homescreen-Installation oder Push-Benachrichtigungen – namhafte Marken wie Starbucks, Pinterest und Twitter haben durch die Migration auf PWA-Technologien ihre Conversion-Rates und Nutzerinteraktionen massiv gesteigert. Doch wie baut man eine solche moderne Anwendung von Grund auf?

Was macht eine Webseite zur PWA?

Eine progressive Web-Anwendung basiert auf bestehenden Webstandards, benötigt jedoch drei unverzichtbare Kernkomponenten, um vom Browser als installierbare App erkannt zu werden:

  • HTTPS: Sicherheit ist Pflicht. Service Worker setzen eine verschlüsselte Verbindung voraus, um Man-in-the-Middle-Angriffe zu verhindern.
  • Service Worker: Ein im Hintergrund laufendes JavaScript-Skript, das Netzwerkanfragen abfängt, Caching-Logiken steuert und die Offline-Funktionalität ermöglicht.
  • Web App Manifest: Eine JSON-Datei, die dem Betriebssystem mitteilt, wie die Anwendung auf dem Gerät des Nutzers (Icons, Start-URL, Anzeigemodus) dargestellt werden soll.

Das Web App Manifest konfigurieren

Das Manifest ist die Steuerungsdatei für die visuelle Integration im Betriebssystem. Hier legen Sie fest, ob Ihre App im Vollbildmodus (Standalone) startet, welche Farben die Statusleiste nutzt und welche Icons auf dem Homescreen platziert werden.

manifest.json
{
  "name": "Meine innovative App",
  "short_name": "MeinApp",
  "description": "Eine moderne, progressive Web-Anwendung",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#0f172a",
  "theme_color": "#6366f1",
  "icons": [
    { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" },
    { "src": "/icons/icon-512-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ]
}
Einbindung im HTML-Header
<link rel="manifest" href="/de/manifest.json">
<meta name="theme-color" content="#6366f1">

Service Worker: Das unsichtbare Kraftpaket

Ein Service Worker agiert als programmierbarer Proxy zwischen dem Webbrowser und dem Netzwerk. Da er in einem eigenen Thread abseits des Haupt-UI-Threads ausgeführt wird, blockiert er niemals das Rendering Ihrer Seite. Er ist dafür zuständig, Ressourcen blitzschnell aus dem Cache zu laden und bei fehlender Internetverbindung Offline-Inhalte bereitzustellen.

Service Worker registrieren (app.js)
// In your main app.js
if ('serviceWorker' in navigator) {
  window.addEventListener('load', async () => {
    try {
      const reg = await navigator.serviceWorker.register('/sw.js');
      console.log('SW registered:', reg.scope);
    } catch (err) {
      console.error('SW registration failed:', err);
    }
  });
}
sw.js — Cache-First-Strategie mit Fallback
const CACHE_NAME = 'v1';
const ASSETS = [
  '/',
  '/css/style.css',
  '/js/app.js',
  '/offline.html',
];

// Install — cache core assets
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(ASSETS))
      .then(() => self.skipWaiting())
  );
});

// Activate — clean old caches
self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then(keys =>
      Promise.all(keys
        .filter(key => key !== CACHE_NAME)
        .map(key => caches.delete(key))
      )
    )
  );
});

// Fetch — serve from cache, fall back to network
self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then(cached => cached || fetch(event.request))
      .catch(() => caches.match('/offline.html'))
  );
});

Die richtige Caching-Strategie wählen

Nicht jede Ressource sollte gleich behandelt werden. Für eine optimale User Experience müssen Sie steuern, wann Daten aus dem Netz und wann aus dem lokalen Speicher geladen werden:

  • Cache First (Zuerst Cache): Ideal für statische Assets wie CSS, JS-Dateien und Bilder. Die App fragt zuerst den Cache ab. Erst wenn dort nichts liegt, folgt der Netzwerkaufruf.
  • Network First (Zuerst Netzwerk): Perfekt für dynamische Inhalte oder API-Endpunkte (z. B. News-Feeds). Es wird versucht, aktuelle Daten online abzurufen. Schlägt dies fehl, greift der Service Worker auf die letzte gespeicherte Version im Cache zurück.
  • Stale-While-Revalidate: Der schnellste Weg für regelmäßig aktualisierte Inhalte. Die App liefert sofort die gecachte Version aus, stößt aber im Hintergrund ein Netzwerk-Update an, um den Cache für den nächsten Aufruf zu aktualisieren.
  • Network Only (Nur Netzwerk): Für Prozesse, die zwingend eine aktive Verbindung erfordern (z. B. Bezahlvorgänge oder POST-Anfragen an eine API).

Die PWA direkt auf dem Gerät installieren

Erfüllt Ihre Web-App alle Kriterien, blendet der Browser automatisch einen Installationshinweis ein. Um die Conversion-Rate zu erhöhen, können Sie diesen Prozess jedoch auch über einen eigenen Button steuern und dem Nutzer einen maßgeschneiderten Call-to-Action anbieten.

Eigener Installations-Button (JavaScript)
let deferredPrompt;

window.addEventListener('beforeinstallprompt', (e) => {
  e.preventDefault();
  deferredPrompt = e;
  document.getElementById('install-btn').style.display = 'block';
});

document.getElementById('install-btn').addEventListener('click', async () => {
  if (!deferredPrompt) return;
  deferredPrompt.prompt();
  const { outcome } = await deferredPrompt.userChoice;
  console.log(`User ${outcome === 'accepted' ? 'installed' : 'dismissed'} the PWA`);
  deferredPrompt = null;
});

So testen Sie Ihre Progressive Web App

Für ein fehlerfreies Nutzererlebnis sollten Sie Ihre PWA vor dem Release gründlich prüfen:

  • Chrome DevTools (Anwendung-Tab): Überprüfen Sie hier den Status Ihres Service Workers, testen Sie das Web App Manifest und werfen Sie einen Blick in den Cache-Speicher.
  • Lighthouse-Audits: Führen Sie direkt im Browser ein automatisiertes Audit durch, um Schwachstellen bei der Performance, Barrierefreiheit und PWA-Konformität aufzudecken.
  • Offline-Simulation: Aktivieren Sie im Netzwerk-Tab der DevTools den "Offline"-Modus, um sicherzustellen, dass Ihre Offline-Fallback-Seite fehlerfrei geladen wird.

Nutzen Sie unsere kostenfreien Performance-Tools

Optimieren Sie die Ladezeiten Ihrer Progressive Web App, indem Sie Ihren JavaScript- und CSS-Code komprimieren.