Mobile‑First Design 2024
svh/lvh/dvh, Container Queries & :has().
Jetzt lesen →Wie Sie Ihre Website in eine installierbare, schnelle und offlinefähige App verwandeln – mit App-Shell, Service Worker und Best Practices.
Legen Sie manifest.webmanifest an (Name, start_url, display, background_color, theme_color, Icons in mehreren Größen).
{
"name": "Northline Demo",
"short_name": "Northline",
"start_url": "/?source=pwa",
"display": "standalone",
"background_color": "#0b1221",
"theme_color": "#0b1221",
"icons": [
{ "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
Registrieren Sie einen Service Worker, cachen Sie statische Assets und definieren Sie Fallbacks für Offline-Routen (App-Shell-Modell).
// /sw.js (Minimalbeispiel - anpassen!)
const CACHE = "nl-pwa-v1";
const ASSETS = [ "/", "/css/styles.css", "/img/dashboard-mock.png" ];
self.addEventListener("install", e => {
e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));
});
self.addEventListener("fetch", e => {
const { request } = e;
e.respondWith(
caches.match(request).then(cached => cached || fetch(request).then(resp => {
// Stale-while-revalidate (einfach)
const copy = resp.clone();
caches.open(CACHE).then(c => c.put(request, copy)).catch(() => {});
return resp;
}).catch(() => caches.match("/offline.html")))
);
});
// Registrierung (z. B. in main.js)
if ("serviceWorker" in navigator) {
window.addEventListener("load", () => {
navigator.serviceWorker.register("/sw.js");
});
}
PWAs brauchen HTTPS oder localhost. Aktivieren Sie HTTP/2/3, setzen Sie korrekte CORS/COEP/COOP-Header für moderne APIs.
Code-Splitting, Bilder in WebP/AVIF, Lazy Loading und CDN. Zielwerte: LCP < 2,5s, CLS < 0,1, INP < 200ms.
Zeigen Sie einen unaufdringlichen Install-Prompt und eine klare App-Navigation (Bottom-Nav, FAB, Gesten). Nutzen Sie Badging & Shortcuts.
// Install-Prompt (Chrome/Android)
let deferredPrompt;
window.addEventListener("beforeinstallprompt", (e) => {
e.preventDefault();
deferredPrompt = e; // später per Button click auslösen
});
async function triggerInstall() {
if (!deferredPrompt) return;
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
deferredPrompt = null;
}
Hinweis: iOS zeigt keinen eigenen Prompt – Nutzer über UI-Hinweis „Zum Home-Bildschirm“ leiten.
offline.html leidet die UX bei Verbindungsproblemen.manifest.webmanifest verlinkt & validiertoffline.html als Fallback vorhandenSie möchten Ihre Seite schnell PWA-ready machen? → Kostenlose Erstberatung anfragen.
Von Manifest bis Service Worker: Wir begleiten Sie Schritt für Schritt – inkl. Lighthouse-Audit, Core-Web-Vitals-Monitoring und Rollout-Plan.