PWA · Урок 30

PWA: оффлайн-режим

Прогрессивные веб-приложения — это сайты, которые ведут себя как приложения: работают без интернета, с иконкой на рабочем столе и ярлыком в меню. Всё на веб-технологиях, без магазинов приложений.

Три кита PWA

Манифест

// public/manifest.webmanifest
{
  "name": "Мой сайт",
  "short_name": "Сайт",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#0b1220",
  "theme_color": "#0b1220",
  "icons": [
    { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
  ]
}
<link rel="manifest" href="/manifest.webmanifest">

Service Worker: кэш и оффлайн

SW — отдельный скрипт, живущий между браузером и сетью. Жизненный цикл: зарегистрировать → предзагрузить кэш → на запрос отдавать кэш, если сеть недоступна.

// public/sw.js
const CACHE = "v1";

self.addEventListener("install", (event) => {
  event.waitUntil(
    caches.open(CACHE).then((c) =>
      c.addAll(["/", "/index.html", "/css/style.css"])
    )
  );
});

self.addEventListener("fetch", (event) => {
  event.respondWith(
    caches.match(event.request)
      .then((hit) => hit || fetch(event.request))
  );
});
// регистрация в скрипте сайта
if ("serviceWorker" in navigator) {
  navigator.serviceWorker.register("/sw.js");
}
💡
Меняете версию приложения — меняйте имя кэша ("v1" → "v2") и удаляйте старые в activate. Иначе пользователи навсегда останутся со старой версией «из кэша».
⚠️
Отладка SW — коварна: он переживает перезагрузку страницы. Ищите в DevTools вкладку Application → Service Workers; «Update on reload» включает свежий SW на каждую перезагрузку.

Что после этого

Сайт можно «установить» — браузер сам предложит «Добавить на главный экран». Плюс push-уведомления (через Notification API) делают веб-приложение ещё ближе к нативному.

ℹ️
Стартуйте быстрее: готовыми каркасами для каталога, кэша и push часто выступают библиотеки вроде vite-plugin-pwa — они генерируют SW и манифест почти без ручного кода.