PWA гайд
Service Worker - шпаргалка
Короткий практический справочник: жизненный цикл, fetch и стратегии кэша, которые работают в реальных проектах на Chrome и Safari.
Все материалы
1. Что это
Service Worker - скрипт между страницей и сетью. Он умеет кэшировать файлы, отвечать offline и обрабатывать фоновые задачи вроде push.
Регистрация со страницы:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
2. Жизненный цикл
| Событие | Когда | Что делать |
install | SW скачан впервые / обновлён | Precache app shell (HTML/CSS/JS/иконки) |
activate | Старый SW ушёл, новый взял контроль | Удалить старые кэши |
fetch | Страница или worker запросили URL | Отдать cache, network или оба |
message | Страница пишет в SW | skipWaiting / свои команды |
3. Минимальный каркас SW
const CACHE = 'app-v1';
const PRECACHE = ['/', '/offline.html', '/static/app.css', '/static/app.js'];
self.addEventListener('install', (event) => {
event.waitUntil(caches.open(CACHE).then((c) => c.addAll(PRECACHE)));
self.skipWaiting();
});
self.addEventListener('activate', (event) => {
event.waitUntil((async () => {
const keys = await caches.keys();
await Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)));
await self.clients.claim();
})());
});
self.addEventListener('fetch', (event) => {
if (event.request.method !== 'GET') return;
event.respondWith((async () => {
const cached = await caches.match(event.request);
if (cached) return cached;
try {
const fresh = await fetch(event.request);
const cache = await caches.open(CACHE);
cache.put(event.request, fresh.clone());
return fresh;
} catch {
return caches.match('/offline.html');
}
})());
});
4. Стратегии кэша
| Стратегия | Для чего | Идея |
| Cache First | CSS, JS, шрифты, иконки | Сначала кэш, сеть только при miss |
| Network First | HTML, API JSON | Сначала сеть, иначе кэш |
| Stale While Revalidate | Почти свежий контент | Отдать кэш сразу, обновить фоном |
| Network Only | Оплата, auth | Кэш не использовать |
5. Chrome vs Safari
| Тема | Chrome / Chromium | Safari / iOS |
| SW + Cache API | Отличная поддержка | Есть, но со лимитами хранилища |
| Background sync | Есть | Ограничено / часто недоступно |
| Очистка данных | Обычно стабильно у установленных PWA | Может чистить агрессивнее |
| HTTPS | Обязателен (localhost ок) | Обязателен |
6. Частые ошибки
- Случайно кэшировать POST / auth-ответы.
- Не поднимать версию кэша - пользователи навсегда на старом JS.
- Precache огромных картинок на install - установка тормозит.
- Нет offline-fallback для навигации.