Progressive Web Apps (PWA) – aplikacje webowe nowej generacji

geek.justjoin.it 2 dni temu

PWA to aplikacja webowa, która zachowuje się jak natywna: instaluje się na ekranie głównym, działa offline i wysyła powiadomienia push. Nie wymaga sklepu z aplikacjami ani osobnych zespołów dla iOS i Androida. Technologia ma już prawie dekadę, ale dopiero ostatnie lata – z lepszym wsparciem Safari na iOS – zamknęły największe luki. W tym artykule wyjaśniamy, czym jest Progressive Web App, jak ją zbudować i kiedy PWA wygrywa z aplikacją natywną.

PWA – co to jest?

Progressive Web App (PWA) to zwykła strona lub aplikacja webowa, rozbudowana o zestaw standardów przeglądarki. Dzięki nim zyskuje cechy znane z aplikacji mobilnych. Pisana jest w HTML, CSS i JavaScript, a działa w każdej nowoczesnej przeglądarce.

Słowo „progressive” oznacza progresywne ulepszanie. Każdy użytkownik dostaje działającą stronę. jeżeli jego przeglądarka obsługuje więcej funkcji, dostaje też instalację, tryb offline czy powiadomienia. Nic się nie psuje u tych, którzy ich nie mają.

Typowa PWA:

  • działa przez HTTPS – to warunek bezpieczeństwa i działania service workerów,
  • ma manifest – plik opisujący nazwę, ikony i sposób wyświetlania aplikacji,
  • ma service worker – skrypt działający w tle, który kontroluje sieć i cache,
  • jest responsywna – dopasowuje się do telefonu, tabletu i desktopu,
  • da się zainstalować – uruchamia się we własnym oknie, bez paska adresu.

Skąd wzięło się PWA?

Termin „Progressive Web Apps” wprowadzili w 2015 roku Frances Berriman i Alex Russell z zespołu Google Chrome. Opisali nim aplikacje webowe, które łączą zasięg internetu z jakością doświadczenia aplikacji mobilnych.

Pomysł nie był nowy. Apple już w 2007 roku, przy premierze pierwszego iPhone’a, proponowało developerom budowanie aplikacji w technologiach webowych. Brakowało jednak narzędzi: offline, powiadomień i dostępu do nowoczesnych API. Dopiero Service Workers i Web App Manifest dały to, czego potrzebowały prawdziwe aplikacje.

Przez lata największą barierą był iOS. Przełom przyszedł w marcu 2023 roku. Safari 16.4 dodało Web Push dla aplikacji dodanych do ekranu głównego (WebKit: Web Push for Web Apps on iOS and iPadOS). Od iOS 26 witryna dodana do ekranu głównego domyślnie otwiera się jako aplikacja webowa. Dla produktów, które muszą działać na iPhone’ach, to zmieniło kalkulację.

Trzy filary PWA

1. HTTPS

Service worker przechwytuje ruch sieciowy, więc przeglądarki dopuszczają go tylko w bezpiecznym kontekście. Wyjątkiem jest localhost na czas developmentu. Certyfikat dostaniesz za darmo, np. z Let’s Encrypt albo od hostingu.

2. Web App Manifest

To plik JSON, który mówi przeglądarce, jak ma wyglądać zainstalowana aplikacja. Najważniejsze pola to:

  • name i short_name – pełna nazwa i skrót pod ikoną,
  • start_url – adres, który otwiera się po uruchomieniu,
  • display – tryb wyświetlania (standalone, minimal-ui, fullscreen, browser),
  • icons – ikony; Chrome oczekuje wersji 192×192 i 512×512 px,
  • theme_color i background_color – kolory paska i ekranu startowego,
  • id i scope – tożsamość aplikacji i zakres adresów, które do niej należą.

3. Service worker

Service worker to skrypt JavaScript działający w osobnym wątku, poza stroną. Pośredniczy między aplikacją a siecią. Możesz w nim zdecydować, czy odpowiedź pochodzi z cache, czy z serwera. Obsługuje też push i synchronizację w tle (tam, gdzie przeglądarka je wspiera). Nie ma dostępu do DOM, a cała komunikacja jest asynchroniczna.

Cykl życia service workera ma trzy etapy: rejestracja, instalacja (tu zwykle zapisujesz zasoby do cache) i aktywacja (tu sprzątasz stare wersje cache).

PWA – tutorial: pierwsza aplikacja krok po kroku

Zbudujemy minimalną PWA bez frameworków. Potrzebujesz edytora, Node.js i dowolnego lokalnego serwera, np. npx serve.

Krok 1: struktura projektu

moja-pwa/ ├── index.html ├── offline.html ├── app.js ├── sw.js ├── manifest.webmanifest └── icons/ ├── icon-192.png └── icon-512.png

Krok 2: manifest

Plik manifest.webmanifest:

{ "id": "/", "name": "Moja pierwsza PWA", "short_name": "MojaPWA", "start_url": "/", "scope": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#0b5fff", "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.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } ] }

Ikona z purpose: maskable pozwala systemowi przyciąć ją do kształtu używanego na danej platformie (koło, zaokrąglony kwadrat).

Krok 3: podpięcie manifestu i rejestracja service workera

W index.html:

<link rel="manifest" href="/manifest.webmanifest"> <meta name="theme-color" content="#0b5fff"> <link rel="apple-touch-icon" href="/icons/icon-192.png">

W app.js:

if ('serviceWorker' in navigator) { window.addEventListener('load', async () => { try { const reg = await navigator.serviceWorker.register('/sw.js'); console.log('Service worker zarejestrowany:', reg.scope); } catch (err) { console.error('Rejestracja nie powiodła się:', err); } }); }

Krok 4: service worker z cache i trybem offline

Plik sw.js:

const CACHE = 'moja-pwa-v1'; const ASSETS = ['/', '/index.html', '/app.js', '/offline.html']; self.addEventListener('install', (event) => { event.waitUntil(caches.open(CACHE).then((cache) => cache.addAll(ASSETS))); self.skipWaiting(); }); self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k))) ) ); self.clients.claim(); }); self.addEventListener('fetch', (event) => { if (event.request.method !== 'GET') return; event.respondWith( caches.match(event.request).then((cached) => cached || fetch(event.request).catch(() => caches.match('/offline.html')) ) ); });

Co tu się dzieje? Przy instalacji zapisujemy podstawowe pliki. Przy aktywacji usuwamy stare wersje cache. Przy każdym żądaniu najpierw szukamy odpowiedzi w cache, a gdy jej brak i sieć nie działa, pokazujemy stronę offline.html.

Krok 5: test

Uruchom serwer i otwórz stronę w Chrome. W DevTools wejdź w zakładkę Application. Sprawdzisz tam manifest, status service workera i zawartość cache. Przełącz Offline w zakładce Network i odśwież stronę. jeżeli widzisz aplikację albo offline.html, działa. W pasku adresu Chrome powinna pojawić się ikona instalacji.

Uwaga: Lighthouse usunął osobną kategorię „PWA” w wersji 12 (2024). przez cały czas możesz sprawdzać instalowalność w DevTools i narzędziach takich jak PWABuilder.

Strategie cache’owania: dobierz do typu zasobu

Największy wpływ na jakość PWA ma nie sam service worker, ale strategia cache’owania. Tabela poniżej pokazuje najczęstsze wzorce.

StrategiaJak działaDobre dla
Cache FirstNajpierw cache, sieć tylko gdy brakFonty, obrazy, pliki z hashem w nazwie
Network FirstNajpierw sieć, cache jako zapasDane, które muszą być aktualne (koszyk, stan konta)
Stale While RevalidateZwraca cache od razu, w tle odświeżaListy produktów, awatary, treści często zmieniane
Network OnlyZawsze siećPłatności, operacje zapisu
Cache OnlyZawsze cacheZasoby zapisane przy instalacji

Nie pisz tego wszystkiego manualnie w większych projektach. Biblioteka Workbox od Google daje gotowe moduły routingu, strategii i precache’u.

Co potrafi PWA w 2026 roku?

Podstawy to instalacja, offline i push. Dziś lista możliwości jest dużo dłuższa:

  • Web Push – powiadomienia także na iOS, ale tylko dla aplikacji dodanych do ekranu głównego,
  • Background Sync i Periodic Background Sync – wysyłka danych po odzyskaniu sieci (Chromium),
  • Badging API – licznik na ikonie aplikacji,
  • Web Share / Web Share Target – udostępnianie do i z aplikacji,
  • File System Access API – odczyt i zapis plików na dysku (Chromium na desktopie),
  • Web Bluetooth, WebUSB, Web Serial – komunikacja ze sprzętem (Chromium),
  • Geolokalizacja, kamera, mikrofon, WebAuthn – szeroko wspierane,
  • App Shortcuts – skróty na ikonie aplikacji,
  • Window Controls Overlay – własny pasek tytułu w aplikacjach desktopowych.

Uwaga: część tych API to wynik inicjatywy Project Fugu, rozwijanej głównie w Chromium. Safari i Firefox wspierają je wybiórczo. Zanim oprzesz na nich kluczową funkcję produktu, sprawdź aktualny stan na Can I use i w dokumentacji MDN.

Wsparcie platform: Android, iOS, desktop

Android (Chrome, Edge, Samsung Internet). To najlepsze środowisko dla PWA. Chrome tworzy tzw. WebAPK – zainstalowaną aplikację widoczną w systemie i szufladzie aplikacji. Dostajesz pełne wsparcie push, background sync i zdarzenie beforeinstallprompt, które pozwala pokazać własny przycisk „Zainstaluj”.

iOS i iPadOS (Safari). Od lat najczęstszy argument przeciwników PWA. Obraz się poprawia: jest Web Push (od iOS 16.4), Badging API i instalacja z menu „Dodaj do ekranu początkowego”. przez cały czas jednak brakuje beforeinstallprompt, więc użytkownika trzeba poinstruować manualnie. Safari nie wspiera też Web Bluetooth ani Background Sync. Apple ograniczało też przez lata trwałość danych w przeglądarce, ale zainstalowane aplikacje webowe mają od tego łagodniejsze reguły. W Unii Europejskiej w 2024 roku Apple zapowiedziało wycofanie pełnego wsparcia PWA w związku z DMA, po krytyce zrezygnowało z tego planu.

Desktop (Chrome, Edge). Zainstalowana PWA otwiera się w osobnym oknie, ma wpis w menu Start czy Launchpadzie i działa jak program. Edge pozwala też publikować PWA w Microsoft Store. Firefox na desktopie nie obsługuje instalacji PWA (na Androidzie tak).

PWA vs native: porównanie

To pytanie pada najczęściej. Odpowiedź zależy od produktu, budżetu i grupy docelowej, nie od mody.

KryteriumPWAAplikacja natywna
TechnologiaHTML, CSS, JS, jedna baza koduSwift/Kotlin lub cross-platform (Flutter, React Native)
DystrybucjaLink w przeglądarce, opcjonalnie sklepyApp Store, Google Play
InstalacjaJedno kliknięcie, kilka KB–MBPobranie ze sklepu, zwykle dziesiątki MB
AktualizacjeNatychmiast po wdrożeniuZależne od sklepu i użytkownika
Koszt rozwojuNiższy – jeden zespół, jeden kodWyższy – osobne wersje lub dodatkowa warstwa
Prowizje sklepówBrak przy własnej dystrybucjiStandardowo do 15–30% od płatności cyfrowych w sklepach
Dostęp do sprzętuOgraniczony, zależny od przeglądarkiPełny
WydajnośćBardzo dobra dla większości aplikacjiNajlepsza, szczególnie w grafice i grach
SEO i odkrywalnośćIndeksowana przez wyszukiwarkiTylko wyszukiwarka sklepu
Tryb offlineTak, ale musisz zaprojektowaćTak, pełna kontrola

Wniosek? PWA wygrywa tam, gdzie liczy się zasięg, koszt i szybkość wdrażania. Natywna aplikacja wygrywa tam, gdzie potrzebujesz głębokiej integracji z systemem.

Przykłady z rynku

Raporty firm technologicznych pokazują, iż PWA potrafi realnie poprawić wyniki. Pamiętaj, iż to dane historyczne z lat 2017–2019. Traktuj je jako ilustrację zjawiska, nie jako aktualny benchmark.

  • Twitter Lite – lekka PWA dla wolnych sieci, według zespołu Twittera dała m.in. wzrost liczby stron na sesję o 65% i spadek współczynnika odrzuceń o 20%.
  • Starbucks – PWA do zamawiania ma około 233 KB, podczas gdy aplikacja na iOS ma ok. 148 MB. Firma podawała też podwojenie liczby aktywnych użytkowników dziennie.
  • Pinterest – po przebudowie mobilnej strony jako PWA firma raportowała m.in. wzrost zaangażowania o 60% i dłuższy czas spędzany w serwisie.
  • AliExpress, Flipkart – oba serwisy opisywały wyraźny wzrost konwersji po przejściu na PWA.

Oryginalne studia przypadków znajdziesz w bibliotece web.dev. Zanim zacytujesz liczby w prezentacji dla zarządu, sprawdź je w źródle.

PWA – zastosowania

PWA sprawdza się najlepiej tam, gdzie najważniejsze są zasięg, szybkie wdrożenie i niski próg wejścia. Oto najczęstsze scenariusze:

  • E-commerce i marketplace’y – szybkie ładowanie, koszyk dostępny przy słabym zasięgu, push o porzuconym koszyku. Do tego pełne SEO, bo sklep przez cały czas jest stroną.
  • Portale newsowe i media – czytanie offline, powiadomienia o najnowszych artykułach, lekki ekran startowy.
  • Aplikacje wewnętrzne i B2B – panele, CRM, narzędzia dla sprzedawców i serwisantów. Nie zmuszasz firm do dystrybucji przez sklepy ani MDM, a aktualizacje wdrażasz centralnie.
  • Aplikacje terenowe – kontrola jakości, inwentaryzacje, formularze zbierane offline i synchronizowane po odzyskaniu sieci.
  • Fintech i usługi lekkie – podgląd salda, wnioski, status zamówień (z zastrzeżeniem regulacji i wymagań bezpieczeństwa).
  • Podróże i transport – bilety, rezerwacje i mapy dostępne bez internetu.
  • Narzędzia produktywności – edytory, notatniki, listy zadań, aplikacje do designu działające w przeglądarce.
  • Startupy i MVP – szybka weryfikacja pomysłu przy ograniczonym budżecie.
  • Rynki z drogą transmisją danych i słabym zasięgiem – lekkość PWA to tam przewaga konkurencyjna.

Kiedy PWA to zły wybór?

PWA nie jest uniwersalną odpowiedzią. Rozważ aplikację natywną, gdy:

  • budujesz grę 3D lub aplikację wymagającą maksymalnej wydajności grafiki,
  • potrzebujesz głębokiej integracji z systemem, np. HealthKit, zaawansowanych funkcji tła, śledzenia lokalizacji w tle czy NFC na iOS,
  • Twój model biznesowy opiera się na obecności w sklepie i jego mechanizmach odkrywania,
  • kluczowa funkcja zależy od API, które nie działa w Safari, a Twoi użytkownicy to głównie posiadacze iPhone’ów.

Częsty kompromis to hybryda. Zachowujesz PWA jako rdzeń, a do sklepów trafia opakowanie: Trusted Web Activity na Androidzie albo Capacitor. Wtedy zyskujesz obecność w sklepie bez dwukrotnego pisania aplikacji.

Narzędzia i frameworki

Zbudujesz PWA w czystym JavaScripcie, ale w praktyce zwykle sięgasz po gotowe narzędzia:

  • Workbox – biblioteka do service workerów i strategii cache’owania,
  • vite-plugin-pwa – generuje manifest i service worker dla projektów na Vite (React, Vue, Svelte),
  • Angular – komenda ng add @angular/pwa konfiguruje manifest i service worker,
  • Next.js – wsparcie dla manifestu w App Routerze oraz biblioteki takie jak Serwist do obsługi service workera,
  • Nuxt – moduł @vite-pwa/nuxt,
  • PWABuilder – narzędzie Microsoftu do analizy PWA i pakowania do Microsoft Store oraz Google Play.

Najczęstsze błędy przy budowie PWA

  1. Cache bez strategii aktualizacji. Użytkownik utknie na starej wersji. Wersjonuj cache i pokaż komunikat „Dostępna nowa wersja”.
  2. Cache’owanie wszystkiego. Nie zapisuj odpowiedzi API z danymi wrażliwymi ani zapytań typu POST.
  3. Brak ekranu offline. Pusta biała strona to najgorszy możliwy efekt.
  4. Ignorowanie iOS. Przetestuj instalację na prawdziwym iPhonie. Emulator i DevTools nie pokażą wszystkich ograniczeń.
  5. Brak własnego przycisku instalacji. Na Androidzie i desktopie obsłuż beforeinstallprompt, na iOS pokaż krótką instrukcję.
  6. Zbyt wielki bundle. PWA przez cały czas musi się gwałtownie ładować. Mierz Core Web Vitals, nie tylko obecność manifestu.
  7. Zapominanie o bezpieczeństwie. Service worker ma szeroką kontrolę nad ruchem, więc pilnuj zakresu (scope), nagłówków i polityki CSP.

Podsumowanie

PWA dojrzało. Nie zastępuje każdej aplikacji natywnej, ale dla wielu produktów – sklepów, portali, narzędzi B2B, aplikacji terenowych i MVP – jest najszybszą i najtańszą drogą do użytkownika. Jedna baza kodu, natychmiastowe aktualizacje i brak prowizji sklepów to argumenty, które trudno zignorować.

Największym ograniczeniem pozostają różnice między przeglądarkami, zwłaszcza w Safari. Dlatego zacznij od analizy: jakie funkcje są najważniejsze i na jakich urządzeniach siedzą Twoi użytkownicy? jeżeli wystarczą Ci API szeroko wspierane, PWA to bezpieczny wybór.

Idź do oryginalnego materiału