PWA-sovellus
React-sovelluksen voi määritellä ns. PWA-sovellukseksi (Progressive Web Application), joka käyttäytyy mobiililaitteilla lisättäessä samalla tavoin kuin sovelluskaupasta asennetut sovellukset. Erona sovelluskaupasta asennettuun sovellukseen on se, että sovellusta lisätään menemällä sovelluksen kotisivuille ja hyväksymällä sovelluksen lisääminen aloitusnäyttöön.
Esimerkiksi Chromessa PWA-sovelluksen asennusta tarjotaan kun:
- käyttäjä on napauttanut sivulla vähintään kerran,
- käyttäjä on ollut sivulla vähintään 30 sekuntia,
- sivusto jaetaan HTTPS-protokollan kautta ja
- sivustolle on määritelty manifest-tiedot.
Sovelluksen julkaisussa voidaan vaikuttaa tästä listasta kahteen viimeiseen kohtaan eli julkaistaan sivusto HTTPS-protokollaa tukevalla sivustolla ja määritellään sovellukselle vaatimukset täyttävät manifest-tiedot.
Seuraavat vaiheet mukailevat seuraavia artikkeleita:
- Turn your react + vite app into a PWA
- Making totally offline-available PWAs with Vite and React
- React PWA with TypeScript using CRA or Vite
- Create a Perfect React Project With Vite
PWA-lisäosan asennus Vite-projektiin
Aloitetaan PWA-sovelluksen määrittely sillä, että asennetaan Vite-projektiin PWA-toiminnallisuuden lisäävä lisäosa. Suorita seuraava komento projektikansiossa:
npm install -D workbox-window vite-plugin-pwa
Edellä olevassa komennossa -D
asentaa paketit kehitysaikaisiksi riippuvuuksiksi (devDependencies
). React-projektien kanssa tarvitaan myös workbox-window
-paketti. Monissa muissa kehitysympäristöissä riittää pelkän vite-plugin-pwa
-paketin asennus.
manifest.json
manifest.json
ja nimensä mukaisesti JSON-muotoinen tiedosto, jossa kerrotaan web-sovelluksen tiedot, kuten esimerkiksi sovelluksen nimi ja ikonit. Virallinen määritelmä määrittelee pitkän listan asioita, jotka sovelluksesta voidaan kertoa. PWA-sovelluksessa näistä ei tarvitse määritellä kaikkia, PWA-sovelluksen kannalta pakolliset ainoastaan pakolliset tarvitsee määritellä.
Luo projektin pääkansioon (eli samaan kansioon missä on index.html
-tiedosto) uusi tiedosto, anna sen nimeksi manifest.json
ja liitä sen sisällöksi seuraavat rivit:
{
"name": "Lemon Clicker",
"short_name": "Lemonade",
"start_url": "/",
"scope": "/",
"display": "standalone",
"orientation": "portrait",
"theme_color": "#EBEBEB",
"background_color": "#EBEBEB"
}
name
määrittelee, millä nimellä sovellus näkyy esim. sovellusvalikossa.short_name
määrittelee, millä nimellä sovellus näkyy esim. sovellusvalikoissa, josname
-määreessä oleva nimi on liian pitkä esitettäväksi.start_url
määrittelee mistä osoitteesta web-sovellus käynnistyy.scope
määrittelee missä osoiteavaruudessa sovelluksen sallitaan navigoivan. Jos käyttäjä avaa sivun, joka onscope
-arvon ulkopuolella, avataan sivu normaaliin web-selainnäkymään. Esimerkkikoodin arvolla sallitaan liikkuminen domain-osoitteen sisällä.display
määrittelee näyttömoodin eli sen, kuinka paljon selaimen käyttöliittymää näytetään.standalone
-arvo määrittelee sovelluksen käyttäytymään omana sovelluksena.orientation
määrittelee miten sovellusta ensisijaisesti käytetään (vaakatasossa vai pystytasossa).theme_color
määrittelee sovelluksen oletusteemavärin, tässä tapauksessa määritelty samaksi kuin sovelluksen taustaväri. Tämä vaikuttaa mm. siihen, miten järjestelmä näyttää sovelluksen.background_color
määrittelee taustavärin, jota käytetään ennen kuin sovelluksen tyylitiedosto on ehditty ladata. Tämä arvo kannattaa olla sama kuin sovelluksen tyylimääritteissä määritelty taustaväri.
Edellä lisätystä manifest.json
-määrittelystä puuttuu kokonaan ikonimäärittelyt, jotka ovat PWA-sovelluksen käytön kannalta pakolliset. Niiden määrittely jätetään seuraavassa vaiheessa käytettävälle sovellukselle.
Sovelluksen ikonit
Sovelluksen ikonit ovat harvoin olemassa, vaan ne joutuu erikseen tekemässä. Haasteelliseksi ikonien teon tekee se, että niitä pitäisi olla usemapaan eri kokoa, jotta ne toimivat optimaalisesti eri laitteilla. Ikonit kannattaa tehdä joko palvelun tai sovelluksen avulla.
Tehdään ikonit käyttämällä pwa-asset-generator -sovellusta. Suorita seuraava komento projektin pääkansiossa:
npx pwa-asset-generator ./src/assets/lemon-big.svg ./public/icons -f -b "#EBEBEB" -m ./manifest.json -i
./index.html -v /icons
Edellä oleva komento on pitkä ja se voi kopioinnin yhteydessä jakautua useammalle riville. Varmista, että annat komennon yhdellä rivillä.
Komennolle annetaan pitkä lista määritteitä, niiden merkitys on seuraava:
./src/assets/lemon-big.svg
määrittelee kuvan, josta ikonit muodostetaan../public/icons
määrittelee kansion, jonne ikonit luodaan.-f
määrittelee, että sovellukselle luodaan ja kytketään favicon-ikoni.-b "#EBEBEB"
määrittelee kuvan taustalla käytettävän taustavärin, sama kuin sovelluksen taustaväri.-m ./manifest.json
määrittelee muokattavan manifest.json-tiedoston sijainnin.-i ./index.html
määrittelee muokattavan index.html-tiedoston sijainnin.-v /icons
määrittelee ikonin linkityksissä käytettävän polun, yliajaa oletuspolun.
Suorituksen jälkeen public/icons-kansioon ilmestyi monta ikonia, manifest.json
-tiedostoon lisättiin ikonimääritykset ja index.html
-tiedostoon lisättiin monta ikonimääritystä.
Projektin PWA-määritykset
Seuraavaksi kytketään projektiin PWA-lisäosa sekä edellä määritellyt manifest-määritykset.
Muokkaa projektin pääkansiossa olevaa vite.config.js-tiedostoa seuraavasti:
-
Lisää tiedoston alkuun seuraavat import-tuonnit:
import { VitePWA } from "vite-plugin-pwa"; import manifest from './manifest.json';
-
Muuta defineConfig-määrittely seuraavanlaiseksi:
export default defineConfig({ plugins: [react(), VitePWA({ manifest: manifest })], })
Tämä lisää Viten PWA-lisäosan osaksi projektia ja antaa määrityksiksi aikaisemmin määrittelemämme
manifest.json
-määritykset.
Projektin rakentaminen
Nyt kaikki asetukset on tehty, jotta voimme rakentaa julkaistava versio (build) sovelluksesta. Tämä tapahtuu seuraavalla komennolla:
npm run build
Komennon rakentaa julkaistavan version sovelluksesta ja lopullinen versio löytyy suorituksen jälkeen projektikansion dist
-kansion alta.
dist/assets
-kansio sisältää kaikki src/assets-kansiosta linkitetyt tiedostot sekä sovelluksen JavaScript-koodin ja CSS-tyylimääritteet kummatkin yhteen tiedostoon koostettuna.
dist/icons
-kansio sisältää kaikki public/icons-kansion alla olevat sovelluksen ikonit.
dist
-kansio sisältää seuraavat tiedostot:
-
index.html
on hyvin pitkälle sama kuin projektikansionindex.html
-tiedosto, build-vaiheessa siihen on lisätty linkitykset rakentamisen yhteydessä muodostettuihin tiedostoihin. -
manifest.webmanifest
on hyvin pitkälle sama mitä edellädefineConfig
-määrittelyn kautta määriteltiin. -
registerSW.js
,sw.js
jaworkbox-xxxxxxxx.js
tiedostot ovat rakentamisen yhteydessä lisättyjä tiedostoja. Ne muodostavat sovelluksen ns. Service Worker -kokonaisuuden. Service Worker on sovelluksen taustalla oleva sovelluksen osa, joka huolehtii taustalla muun muassa sovelluksen uuden version lataamisesta.Tämä on kätevää esimerkiksi PWA-sovelluksissa, jotka on asennettu mobiililaitteelle sovelluksena. Tällöin itse sovellus käynnistyy nopeasti käyttäen sitä versiota, joka laitteen muistiin on tallennettu. Kun sovellusta käytetään, käy Service Worker taustalla lataamassa uudemman version laitteelle. Oletusmäärityksillä uutta, ladattua versiota käytetään sovelluksen seuraavalla käynnistyskerralla.
Rakennetun projektin esikatselu
Ennen kuin sovellusta lähdetään julkaisemaan, kannattaa rakennettu versio esikatsella ensin omalla laitteella. Tämä tapahtuu komennolla:
npm run preview
Tämä komento tulostaa seuraavan kaltaisen tulostuksen:
> lemon-clicker@0.0.0 preview
> vite preview
➜ Local: http://localhost:4173/
➜ Network: use --host to expose
Komento käynnistää paikallisesti toimivan web-palvelimen, joka näkyy tulostuksen ilmoittamassa osoitteessa. Kun menet selaimella tuohon osoitteeseen, niin näet sovelluksesta sen rakennetun version.

Huomaa, että preview-toiminnolla toimiva sivusto on tarkoitettu ainoastaan rakennetun sovelluksen esikatseluun, sitä ei ole tarkoitettu julkaisumenetelmäksi.
Muutosten vienti versiohallintaan
Viedään viimeisimmät muutokset versiohallintaan.
git add .
git commit -m "lisää PWA-lisäosan ja sen määritykset"