Przejdź do głównej zawartości

28. Progressive Web Apps

Progressive Web Apps

PWA to strona internetowa, która zachowuje się jak aplikacja mobilna: działa offline, można ją zainstalować na ekranie głównym, wysyła powiadomienia push. Korzystają z nich Twitter, Pinterest, Starbucks i Uber. Ta prezentacja wyjaśnia trzy filary PWA: service worker, manifest i HTTPS.

  1. Co odróżnia PWA od zwykłej strony? — installability, offline, push notifications
  2. Co to jest Service Worker? — skrypt działający w tle, przechwytywanie żądań
  3. Jakie są ograniczenia PWA? — dostęp do hardware, iOS vs Android
  1. Problem: mobilne aplikacje webowe bez sklepu
  2. Trzy wymagania PWA: HTTPS + Service Worker + Web App Manifest
  3. Web App Manifest — JSON definiujący ikonę, nazwę, kolor, tryb wyświetlania
  4. Service Worker — cykl życia, rejestracja, interceptowanie żądań
  5. Cache API — przechowywanie zasobów offline
  6. Install prompt — beforeinstallprompt event
  7. Porównanie: PWA vs Natywna aplikacja mobilna

Schemat Service Worker

Cykl życia: install → activate → fetch/intercept

manifest.json

Przykład pliku manifest z opisem każdego pola

Minimum:

  • Definicja PWA i trzy wymagania
  • Przykład manifest.json
  • Dwa przykłady zastosowań PWA

Forma: 10 slajdów, 10 minut

Ocena: 3.0
manifest.json
{
"name": "Moja Aplikacja",
"short_name": "MojaApp",
"description": "Przykładowa PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#0070f3",
"icons": [
{
"src": "/icons/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
// Rejestracja Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW zarejestrowany:', reg.scope))
.catch(err => console.error('Błąd rejestracji SW:', err));
}
// sw.js — podstawowy Service Worker z cache
const CACHE_NAME = 'v1';
const ASSETS = ['/', '/style.css', '/app.js'];
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS))
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then(cached => cached || fetch(event.request))
);
});

Pokaż na telefonie

Otwórz dowolną PWA (np. twitter.com) na telefonie i dodaj do ekranu głównego — live demo

Lighthouse screenshot

Zrób screenshot audytu Lighthouse dla wybranej strony i pokaż wynik PWA