Что такое сервис-воркер и как работает PWA в Angular?
Сервис-воркер (Service Worker) — это скрипт, работающий в фоновом режиме вне основного потока браузера. Он перехватывает сетевые запросы, управляет кэшированием и позволяет реализовать offline-режим, push-уведомления и другие возможности, характерные для Progressive Web App (PWA). В Angular поддержка PWA реализована через встроенный пакет @angular/service-worker, который обеспечивает автоматическое подключение сервис-воркера и управление кэшем на основе конфигурационного файла.
1. Основы работы сервис-воркера
Сервис-воркер — это прокси между браузером и сетью. Его основные функции:
-
Кэширование HTML, CSS, JS, API-ответов.
-
Работа в offline-режиме.
-
Управление обновлениями.
-
Push-уведомления и фоновая синхронизация.
Особенности:
-
Работает на отдельном потоке.
-
Не имеет доступа к DOM.
-
Может обслуживать запросы даже при отсутствии интернета.
-
Привязан к определённому origin и пути.
2. Добавление PWA в Angular-проект
Для добавления сервис-воркера используется Angular CLI:
ng add @angular/pwa
Эта команда:
-
Устанавливает @angular/service-worker.
-
Добавляет ngsw-config.json.
-
Обновляет angular.json (добавляет serviceWorker: true для production).
-
Создаёт manifest.webmanifest (иконки, название и т. д.).
3. Конфигурация angular.json
В разделе projects > architect > build > configurations > production:
"serviceWorker": true,
"ngswConfigPath": "ngsw-config.json"
Service Worker активируется только в production-сборке (ng build --prod).
4. Конфигурация ngsw-config.json
Это основной файл конфигурации сервис-воркера. Он управляет тем, что и как будет кэшироваться.
Пример:
{
"index": "/index.html",
"assetGroups": \[
{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": \[
"/favicon.ico",
"/index.html",
"/\*.css",
"/\*.js"
\]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": \["/assets/\*\*", "/\*.(png|jpg|jpeg|svg|webp)"\]
}
}
\],
"dataGroups": \[
{
"name": "api-calls",
"urls": \["/api/\*\*"\],
"cacheConfig": {
"maxSize": 100,
"maxAge": "6h",
"timeout": "10s",
"strategy": "performance"
}
}
\]
}
Ключевые параметры:
-
installMode: prefetch — ресурсы загружаются сразу.
-
installMode: lazy — ресурсы загружаются при первом запросе.
-
updateMode: prefetch — обновления загружаются сразу при обнаружении новой версии.
-
strategy: freshness | performance — выбор между приоритетом сети или кэша.
5. Сценарии использования
Кэширование статических файлов
Содержимое из assetGroups кэшируется при установке.
Кэширование динамических API-запросов
Настраивается в dataGroups, например:
-
Стратегия performance: ответ из кэша, затем обновление.
-
Стратегия freshness: сначала сеть, потом кэш.
6. Установка и регистрация сервис-воркера
В main.ts Angular CLI автоматически добавляет регистрацию:
if (environment.production) {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(() => navigator.serviceWorker.register('/ngsw-worker.js'));
}
Если используется @angular/service-worker, Angular сам управляет регистрацией.
7. Работа с SwUpdate
Angular предоставляет сервис SwUpdate для управления обновлениями приложения:
constructor(private swUpdate: SwUpdate) {
if (this.swUpdate.isEnabled) {
this.swUpdate.available.subscribe(() => {
if (confirm("Новая версия доступна. Обновить?")) {
window.location.reload();
}
});
}
}
Сценарий:
-
Пользователь загружает приложение.
-
Выходит новая сборка.
-
SwUpdate обнаруживает обновление.
-
Предлагается обновить страницу.
8. Offline поддержка
Если все необходимые ресурсы закэшированы, приложение может работать offline. Angular Service Worker обслуживает запросы даже без соединения с сетью, пока контент есть в кэше.
Рекомендации:
-
Добавить index.html, *.js, *.css, assets/** в assetGroups.
-
Настроить dataGroups для API с кэш-стратегиями.
-
Убедиться, что все страницы SPA обрабатываются Angular Router.
9. Manifest и A2HS
manifest.webmanifest описывает, как приложение выглядит при установке:
{
"name": "My Angular PWA",
"short_name": "MyPWA",
"theme_color": "#1976d2",
"background_color": "#fafafa",
"display": "standalone",
"start_url": "/",
"icons": \[
{
"src": "assets/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
...
\]
}
После добавления манифеста и сервис-воркера, браузер предложит установить приложение на рабочий стол (Add To Home Screen — A2HS).
10. Проверка PWA
Откройте приложение в Chrome:
-
Откройте DevTools → Application → Service Workers.
-
Проверьте, зарегистрирован ли воркер.
-
Переключитесь в offline-режим и обновите.
-
Используйте вкладку Lighthouse для анализа.
11. Удаление или обновление кэша
Service Worker в Angular сам удаляет старые кэши на основе ngsw.json. Однако при глобальных изменениях структуры лучше инвалидацию делать через ngswConfigPath и перезапуск CI/CD.
Для ручного сброса:
this.swUpdate.activateUpdate().then(() => document.location.reload());
12. Ограничения Angular Service Worker
-
Не поддерживает custom-воркеры напрямую.
-
Нет полной гибкости как в Workbox.
-
Обновления могут применяться не мгновенно, если вкладка открыта.
13. Интеграция push-уведомлений
Сервис-воркер можно использовать для push-уведомлений через Push API, но Angular CLI не предоставляет встроенной реализации — нужна ручная настройка с использованием Notification API и Web Push.
14. Сборка PWA
ng build --configuration production
После сборки в /dist/ будет файл:
-
ngsw.json — карта кэширования.
-
ngsw-worker.js — воркер.
-
Статические файлы, определённые в ngsw-config.json.
Сервис-воркер в Angular позволяет реализовать надёжные PWA-приложения с offline-доступом, мгновенной загрузкой, кэшированием и управлением версиями. Angular CLI автоматизирует большую часть работы, обеспечивая разработчику только настройку правил и внедрение логики обновлений.