Service Worker — это скрипт, работающий в фоне браузера, который позволяет реализовать кэширование ресурсов, оффлайн-режим, push-уведомления и другие возможности прогрессивных веб-приложений. Интеграция Service Worker в приложения на Lit требует понимания жизненного цикла компонентов и правильного взаимодействия с браузерным API.
Для начала необходимо зарегистрировать Service Worker в основном
файле приложения. В Lit-приложениях это чаще всего делается в
index.js или main.js:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker зарегистрирован с областью:', registration.scope);
})
.catch(error => {
console.error('Ошибка регистрации Service Worker:', error);
});
});
}
Ключевые моменты:
'serviceWorker' in navigator.load, чтобы не
блокировать рендеринг страницы.register возвращает промис с объектом
регистрации, через который можно управлять обновлениями и состоянием
Service Worker.Файл sw.js содержит логику кэширования и обработки
сетевых запросов. Основные части:
const CACHE_NAME = 'lit-app-cache-v1';
const ASSETS_TO_CACHE = [
'/',
'/index.html',
'/styles.css',
'/bundle.js'
];
install — установка и
предварительное кэширование:self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => cache.addAll(ASSETS_TO_CACHE))
.then(() => self.skipWaiting())
);
});
event.waitUntil гарантирует завершение
кэширования перед активацией.self.skipWaiting() позволяет новому Service Worker
сразу переходить в активное состояние.activate — очистка устаревших
кэшей:self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(keys =>
Promise.all(
keys.map(key => {
if (key !== CACHE_NAME) return caches.delete(key);
})
)
)
);
self.clients.claim();
});
self.clients.claim() позволяет активному Service Worker
управлять всеми открытыми страницами сразу.fetch:self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
});
Lit-компоненты работают с реактивными свойствами и шаблонами. Service Worker можно использовать для:
Пример интеграции динамических данных:
self.addEventListener('fetch', event => {
const url = new URL(event.request.url);
if (url.pathname.startsWith('/api/')) {
event.respondWith(
fetch(event.request)
.then(networkResponse => {
return caches.open(CACHE_NAME).then(cache => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
})
.catch(() => caches.match(event.request))
);
}
});
Для корректной работы приложения важно обрабатывать обновления Service Worker:
navigator.serviceWorker.register('/sw.js').then(reg => {
reg.onupdatefo und = () => {
const newWorker = reg.installing;
newWorker.onstatecha nge = () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
console.log('Доступна новая версия приложения');
}
};
};
});
onupdatefound срабатывает при обнаружении новой
версии SW.installed указывает на готовность нового
Service Worker.CACHE_NAME) для
упрощения управления обновлениями.MessageChannel для уведомления
компонентов о доступности обновлений.Service Worker в связке с Lit позволяет создавать быстрые, устойчивые к сетевым сбоям приложения, полностью использующие преимущества реактивного рендеринга и компонентной архитектуры.