Skip to content

Perf: service worker és offline működés #73

Description

@Xentinus

Jelenség

Az oldal félig telepíthető: van site.webmanifest (display: standalone, ikonok, theme_color, start_url), tehát a böngésző felajánlja a telepítést — de service worker nincs, tehát:

  • telepítés után is minden indítás hálózatot igényel, offline egy hibaoldal jön
  • a visszatérő látogató nem kap azonnali betöltést, pedig a bundle és a betűkészletek hónapokig változatlanok
  • a standalone megjelenítés így többet ígér, mint amit az oldal tud

Javaslat

  1. vite-plugin-pwa (Workbox alapú) a publikus app buildjébe, generateSW stratégiával — kézzel írt service workert itt nem érdemes fenntartani.
  2. Cache-stratégiák tartalomtípus szerint:
    • hashelt bundle és betűfájlok: CacheFirst (a fájlnév hordozza a verziót)
    • /api/attachments/*: CacheFirst hosszú TTL-lel — a slug immutable, a válasz ma is max-age=31536000, immutable
    • olvasó API (/api/works stb.): NetworkFirst rövid timeouttal, hogy offline a legutóbbi tartalom látszódjon
    • a HTML: NetworkFirst. Ez a kritikus pont: a szerver oldalanként más head-et ír (SpaShell), tehát egy cache-elt HTML rossz oldalhoz tartozó metaadatot és — a SEO: nyelv az URL-ben (/en/...) és hreflang #55 után — rossz nyelvet szolgálhatna ki. CacheFirst a HTML-re itt hibás lenne.
  3. Offline fallback oldal (a NotFoundView / StatusPanel mintájára), hogy hálózat nélkül is a site arculata jöjjön, ne a böngésző hibaoldala.
  4. Frissítési folyamat: registerType: "prompt" és egy „új verzió elérhető, újratöltés" jelzés. Automatikus skipWaiting nélkül nem cserélődik a worker, azzal pedig a futó oldal alatt cserélődik a bundle — a kérdést el kell dönteni, nem alapértékként hagyni.
  5. Analytics kölcsönhatás: a trackView beacon keepalive: true-val megy; a service worker ne cache-elje vagy ismételje meg a POST /api/activity/view kéréseket, különben hamis megtekintések keletkeznek.
  6. A ?notrack=1 kizárás localStorage-ban él, azt a service worker nem érinti — de a viselkedést telepített appban is érdemes ellenőrizni.
  7. Fejlesztői kellemetlenség: egy rosszul beállított service worker a legnehezebben debuggolható hibaosztály (elavult bundle, ami nem frissül). Érdemes csak production buildben regisztrálni, és a deploy/RUNBOOK.md-be beírni, hogyan lehet kényszerítve kiüríteni.

Érintett fájlok

  • portfoliocms.client/vite.config.ts, package.json
  • portfoliocms.client/src/main.ts (regisztráció)
  • új offline fallback komponens a src/views/ alatt
  • portfoliocms.client/public/site.webmanifest
  • PortfolioCMS.Core/Middleware/SecurityHeadersMiddleware.cs (ha a CSP-t érinti)
  • deploy/RUNBOOK.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions