Ukratko

Najvažnije iz članka

  • PWA-ovi kombiniraju najbolje značajke weba i nativnih aplikacija, nudeći pouzdanost, brzinu i angažman korisnika kroz Service Workere i Web App Manifest.
  • Workbox je Googleova biblioteka koja pojednostavnjuje razvoj Service Workera, pružajući preddefinirane strategije keširanja (npr. `CacheFirst`, `NetworkFirst`) i alate za precaching.
  • Za pretvaranje React aplikacije u PWA, potrebno je registrirati Service Worker (CRA to radi automatski), konfigurirati Workbox za upravljanje keširanjem statičkih i dinamičkih resursa, te definirati Web App Manifest.
  • Testiranje PWA-a uključuje provjeru funkcionalnosti offline rada, instalacije na početni zaslon i performansi putem Lighthouse audita, osiguravajući optimizirano korisničko iskustvo.
Sadržaj članka
  1. Što su PWA i zašto su važne?
  2. Ključni elementi PWA-a
  3. Workbox: Pojednostavljivanje razvoja Service Workera
  4. Korak po korak: React PWA s Workboxom
  5. 1. Inicijalizacija React projekta (ako već niste)
  6. 2. Razumijevanje postojećeg Service Workera (CRA)
  7. 3. Konfiguracija Workboxa
  8. 4. Registracija Service Workera
  9. 5. Web App Manifest
  10. 6. Testiranje PWA-a
  11. 7. Dodatne Workbox značajke
  12. Zaključak

Progresivne web aplikacije (PWA) predstavljaju konvergenciju najboljih značajki weba i nativnih mobilnih aplikacija. One donose pouzdanost, brzinu i angažman korisnika, nudeći iskustvo koje je često neprimjetno od nativnih rješenja. Ključna prednost PWA-a leži u njihovoj "progresivnoj" prirodi – temeljne funkcionalnosti dostupne su svim korisnicima, a napredne značajke, poput offline rada ili instalacije na početni zaslon, dostupne su samo korisnicima s kompatibilnim preglednicima. U ovom opsežnom vodiču, istražiti ćemo kako transformirati standardnu React aplikaciju u potpunu PWA koristeći moćnu Workbox biblioteku.

Što su PWA i zašto su važne?

PWA nisu zasebna tehnologija, već set preporuka i najboljih praksi koje, kada se implementiraju, omogućuju web aplikacijama da se ponašaju poput nativnih. Tri ključne karakteristike PWA-a su:

  • Pouzdane (Reliable): Brzo se učitavaju i rade čak i u uvjetima loše ili nepostojeće internetske veze zahvaljujući Service Workerima i cache strategijama.
  • Brze (Fast): Odmah reagiraju na korisničke interakcije s tečnim animacijama i brzim učitavanjem sadržaja, pružajući doživljaj nalik nativnom.
  • Angažirajuće (Engaging): Mogu se "instalirati" na početni zaslon korisnikovog uređaja, slati push notifikacije i pristupati naprednim značajkama uređaja, potičući ponovno korištenje.

Važnost PWA-a raste jer sve više korisnika očekuje iskustvo nalik aplikaciji na webu, a tvrtke žele smanjiti troškove razvoja i distribucije u usporedbi s nativnim aplikacijama. PWA omogućuju širi doseg korisnika, niže barijere za ulazak (nema potrebe za preuzimanjem iz trgovine aplikacija) i poboljšano SEO rangiranje.

Ključni elementi PWA-a

Da bi web aplikacija bila PWA, mora ispunjavati određene uvjete i implementirati specifične tehnologije:

  1. Service Workers: Nalik proxyju koji se nalazi između preglednika i mreže. Oni presreću mrežne zahtjeve, upravljaju cacheom i omogućuju offline funkcionalnost. Osnova su svakog PWA-a.
  2. Web App Manifest: JSON datoteka koja definira metapodatke aplikacije, poput imena, ikona, početne URL adrese, orjentacije prikaza i boje teme. Omogućuje da se aplikacija instalira na početni zaslon.
  3. HTTPS: Sigurna veza je obavezna jer Service Worker može presretati zahtjeve, što zahtijeva povjerenje i sprječavanje MITM (Man-in-the-Middle) napada.
  4. Responzivni dizajn: Aplikacija mora izgledati i raditi dobro na svim veličinama zaslona i uređajima.

Workbox: Pojednostavljivanje razvoja Service Workera

Programiranje Service Workera od nule može biti složeno i podložno greškama. Tu na scenu stupa Workbox, skup biblioteka i alata tvrtke Google koji pojednostavljuju implementaciju Service Workera. Workbox pruža visokorazinske apstrakcije i preddefinirane strategije keširanja, čime se drastično smanjuje količina koda koju trebate napisati i održavati.

Ključne značajke Workboxa:

  • Predkeširanje (Precaching): Automatski kešira statičke resurse (HTML, CSS, JavaScript, slike) tijekom faze instalacije Service Workera.
  • Strategije keširanja (Runtime Caching Strategies): Nudi različite strategije za dinamičke resurse (API pozivi, slike koje se učitavaju kasnije), kao što su:
    • Stale While Revalidate: Odmah vraća keširanu verziju resursa i istovremeno pokušava ažurirati keš s mrežnom verzijom.
    • Cache First: Prvo provjerava keš; ako je resurs tamo, vraća ga. Ako ne, odlazi na mrežu i kešira odgovor.
    • Network First: Prvo pokušava dohvatiti resurs s mreže; ako ne uspije, vraća keširanu verziju.
    • Cache Only: Uvijek vraća resurs iz keša; nikad ne ide na mrežu.
    • Network Only: Uvijek pokušava dohvatiti resurs s mreže; nikad ne gleda u keš.
  • Pozadinska sinkronizacija (Background Sync): Omogućuje da se mrežni zahtjevi odgode dok korisnik ne dobije stabilnu vezu, idealno za slanje podataka izvan mreže.
  • Push Notifikacije: Jednostavnija implementacija push notifikacija.

Korak po korak: React PWA s Workboxom

Započnimo s postojećom React aplikacijom. Pretpostavimo da koristite Create React App (CRA), jer on već pruža osnovnu strukturu i neke PWA značajke "iz kutije".

1. Inicijalizacija React projekta (ako već niste)

Ako već nemate React projekt, kreirajte ga:

npx create-react-app my-pwa-app --template cra-template-pwa
cd my-pwa-app

CRA je od verzije 4.0 počeo nuditi --template cra-template-pwa koji već uključuje osnovni Service Worker. Ako ste kreirali projekt bez ovog templatea, morat ćete ručno ažurirati index.js.

2. Razumijevanje postojećeg Service Workera (CRA)

Otvorite src/index.js i primijetit ćete liniju:

serviceWorkerRegistration.register();

Ova funkcija dolazi iz src/serviceWorkerRegistration.js. Unutar te datoteke nalazi se logika za registraciju Service Workera. Važno: CRA-ov Service Worker je optimiziran za keširanje statičkih asseta za offline rad. Za složenije scenarije, morat ćemo ga prilagoditi ili zamijeniti.

Za produkcijske PWA-e, često se preporučuje izbacivanje (eject) CRA-a (npm run eject) ili korištenje alata kao što je Craco za prilagodbu Webpack konfiguracije bez ejectanja. U svrhu ovog vodiča, fokusirat ćemo se na konfiguraciju Workboxa, što je primjenjivo neovisno o tome kako gradite React aplikaciju.

3. Konfiguracija Workboxa

Ako koristite CRA 4.0+ i cra-template-pwa, Workbox je već integriran. Međutim, ako želite finu kontrolu, ili ako niste koristili taj template, morat ćete sami konfigurirati Workbox.

Opcija A: Korištenje workbox-webpack-plugin (Preporučeno za potpunu kontrolu)

Ova opcija zahtijeva da imate pristup Webpack konfiguraciji (npr. nakon eject-a ili s Craco-om).

Instalirajte Workbox Webpack plugin:

npm install workbox-webpack-plugin --save-dev

U svojoj Webpack konfiguraciji (npr. config/webpack.config.js nakon ejecta), dodajte plugin:

// ... ostali importi
const WorkboxWebpackPlugin = require('workbox-webpack-plugin');

// ... unutar plugins arraya
new WorkboxWebpackPlugin.GenerateSW({
  clientsClaim: true,
  skipWaiting: true,
  // Ovdje definirate strategije keširanja
  runtimeCaching: [
    {
      urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
      handler: 'CacheFirst',
      options: {
        cacheName: 'images',
        expiration: {
          maxEntries: 50,
          maxAgeSeconds: 30 * 24 * 60 * 60, // 30 dana
        },
      },
    },
    {
      urlPattern: /^https:\/\/api\.example\.com\/api\//,
      handler: 'NetworkFirst',
      options: {
        cacheName: 'api-data',
        expiration: {
          maxEntries: 10,
          maxAgeSeconds: 5 * 60, // 5 minuta
        },
      },
    },
    {
      urlPattern: ({ request }) => request.mode === 'navigate',
      handler: 'NetworkFirst',
      options: {
        cacheName: 'pages',
      },
    },
  ],
}),

GenerateSW će generirati kompletan Service Worker kod za vas. clientsClaim: true i skipWaiting: true osiguravaju da novi Service Worker preuzme kontrolu čim se instalira i aktivira, bez potrebe za osvježavanjem stranice. runtimeCaching je ključan za definiranje kako se dinamički resursi (poput API poziva ili slika s CDN-a) keširaju.

Opcija B: Korištenje injectManifest (za napredne scenarije s custom SW-om)

Ako imate postojeći, ručno napisani Service Worker i želite samo integrirati Workbox značajke, koristite injectManifest.

// ... unutar plugins arraya
new WorkboxWebpackPlugin.InjectManifest({
  swSrc: './src/custom-service-worker.js', // Vaš Service Worker
  swDest: 'service-worker.js', // Naziv izlazne datoteke
}),

Unutar src/custom-service-worker.js trebali biste imati:

import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { CacheFirst, NetworkFirst } from 'workbox-strategies';

// Ovo će Workbox automatski popuniti listu asseta za precaching
precacheAndRoute(self.__WB_MANIFEST);

// Primjer runtime caching strategije
registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new NetworkFirst({
    cacheName: 'api-cache',
  })
);

registerRoute(
  ({ request }) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new workbox.expiration.ExpirationPlugin({
        maxEntries: 60,
        maxAgeSeconds: 30 * 24 * 60 * 60, // 30 dana
      }),
    ],
  })
);

4. Registracija Service Workera

Bez obzira na Workbox konfiguraciju, morate registrirati svoj Service Worker u src/index.js:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
// Importirajte umjesto serviceWorkerRegistration ako ste ga uklonili/želite fleksibilniju kontrolu
// import * as serviceWorker from './serviceWorker'; // Ako koristite CRA template

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// Ako koristite CRA-ov serviceWorkerRegistration.js:
import * as serviceWorkerRegistration from './serviceWorkerRegistration';
serviceWorkerRegistration.register();

// Druga opcija, ako ručno registrirate custom SW:
// if ('serviceWorker' in navigator) {
//   window.addEventListener('load', () => {
//     navigator.serviceWorker.register('/service-worker.js')
//       .then(registration => {
//         console.log('SW registriran: ', registration);
//       })
//       .catch(registrationError => {
//         console.log('SW registracija neuspješna: ', registrationError);
//       });
//   });
// }

Napomena: Za razvoj, Service Worker se kešira agresivno. U pregledniku (Developer Tools -> Application -> Service Workers) možete ga "unregister" i "update" kako biste osigurali da uvijek testirate najnoviju verziju.

5. Web App Manifest

Kreirajte datoteku public/manifest.json (CRA to radi automatski):

{
  "short_name": "Moja PWA",
  "name": "Potpuno funkcionalna React PWA aplikacija",
  "icons": [
    {
      "src": "favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "logo192.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "logo512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}

I povežite ga u public/index.html:

<link href=""%PUBLIC_URL%/manifest.json"" />

6. Testiranje PWA-a

Nakon što postavite sve, izradite produkcijski build:

npm run build

Zatim poslužite build mapu pomoću statičkog servera (npr. serve paket):

npm install -g serve
serve -s build

Otvorite preglednik (Chrome preporučeno), idite na localhost:5000 (ili port koji serve koristi).

Provjerite:

  • Developer Tools -> Application -> Manifest: Trebali biste vidjeti detalje manifesta i opciju za dodavanje na početni zaslon.
  • Developer Tools -> Application -> Service Workers: Status bi trebao biti "activated and running". Ispod bi trebali biti keširani resursi.
  • Developer Tools -> Network: Isključite internet ili postavite na "Offline". Aplikacija bi trebala i dalje raditi, a zahtjevi bi trebali pokazivati da dolaze iz Service Workera.
  • Lighthouse Audit: Pokrenite Lighthouse audit (Developer Tools -> Lighthouse) i provjerite "Progressive Web App" kategoriju. Trebali biste dobiti visoku ocjenu.

7. Dodatne Workbox značajke

Pozadinska sinkronizacija (Background Sync)

Ovo je korisno kada želite poslati podatke na server, ali korisnik je izvan mreže. Workbox će automatski pokušati poslati zahtjev kada se veza uspostavi.

U Service Workeru (koristeći injectManifest opciju):

import { BackgroundSyncPlugin } from 'workbox-background-sync';
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';

const bgSyncPlugin = new BackgroundSyncPlugin('myQueueName', {
  maxRetentionTime: 24 * 60 // Ponavljaj 24 sata
});

registerRoute(
  /api\/submitData/,
  new NetworkOnly({
    plugins: [bgSyncPlugin]
  }),
  'POST'
);

Push Notifikacije

Za push notifikacije potrebni su vam backend i ključevi za VAPID protokol. Workbox olakšava klijentsku stranu implementacije.

U Service Workeru:

self.addEventListener('push', (event) => {
  const title = 'Nova obavijest!';
  const options = {
    body: event.data.text(),
    icon: '/logo192.png',
    badge: '/badge.png'
  };
  event.waitUntil(self.registration.showNotification(title, options));
});

self.addEventListener('notificationclick', (event) => {
  event.notification.close();
  event.waitUntil(clients.openWindow('https://your-pwa-url.com/'));
});

Na klijentskoj strani (React komponenta):

// Funkcija za registraciju za push notifikacije
async function subscribeUser() {
  if ('serviceWorker' in navigator) {
    try {
      const registration = await navigator.serviceWorker.ready;
      const subscription = await registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY' // Generirajte na serveru
      });
      // Pošalji subscription objekt na backend server
      console.log('User subscribed:', subscription);
    } catch (error) {
      console.error('Failed to subscribe the user:', error);
    }
  }
}

// Pozovite ovu funkciju npr. na klik gumba ili nakon što korisnik odobri dozvolu
// <button notifikacije</button>

Zaključak

Transformacija React aplikacije u Progresivnu Web Aplikaciju uz Workbox značajno poboljšava korisničko iskustvo, pružajući pouzdanost, brzinu i angažman koji se očekuju od nativnih aplikacija. Iako početna konfiguracija može zahtijevati određeni napor, Workbox drastično pojednostavnjuje rad sa Service Workerima, omogućujući developerima da se fokusiraju na logiku aplikacije. Implementacijom cache strategija, manifest datoteke i dodatnih značajki poput pozadinske sinkronizacije i push notifikacija, vaša React aplikacija može postati moćan alat dostupan na svim platformama.

Budućnost weba je progresivna, a alati poput Workboxa čine tu budućnost dostupnom već danas. Redovito testiranje i praćenje Lighthouse izvještaja pomoći će vam da osigurate da vaša PWA ispunjava najbolje prakse i pruža optimalno korisničko iskustvo.


Izvori i dodatno čitanje

  1. Workbox - Google Developers
  2. Progressive Web Apps (PWA) - MDN Web Docs
  3. Create React App - Adding a Service Worker
  4. Lighthouse - Google Developers
B
Uredništvo portala

BAJT

Službeni autorski profil redakcije portala BAJT. Sadržaj priprema i provjerava uredništvo portala.