Service Worker — это скрипт, работающий в фоновом режиме отдельно от веб-страницы, который позволяет управлять сетевыми запросами, кэшированием ресурсов и обеспечивать офлайн-доступ. В контексте Lit, Service Worker играет ключевую роль в повышении производительности и надежности приложений.
Для использования Service Worker необходимо его зарегистрировать в основном файле приложения:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Service Worker зарегистрирован с областью:', registration.scope);
})
.catch(error => {
console.error('Ошибка регистрации Service Worker:', error);
});
}
Особенности:
DOMContentLoaded или в основном JS-файле).Основные жизненные циклы Service Worker:
Пример базового Service Worker:
const CACHE_NAME = 'lit-app-cache-v1';
const URLS_TO_CACHE = [
'/',
'/index.html',
'/styles.css',
'/main.js'
];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => cache.addAll(URLS_TO_CACHE))
);
});
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(cacheNames =>
Promise.all(
cacheNames.map(name => {
if (name !== CACHE_NAME) {
return caches.delete(name);
}
})
)
)
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
});
Стратегии кэширования:
Пример стратегии Stale-While-Revalidate:
self.addEventListener('fetch', event => {
event.respondWith(
caches.open(CACHE_NAME).then(cache =>
cache.match(event.request).then(response => {
const fetchPromise = fetch(event.request).then(networkResponse => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return response || fetchPromise;
})
)
);
});
Lit строит интерфейс на основе Web Components, что делает работу с Service Worker особенно эффективной:
import() или
LitElement с динамическим импортом) легко кэшируется для
ускорения повторного открытия страниц.Пример кэширования данных API в Lit-компоненте:
import { LitElement, html, css } from 'lit';
class UserList extends LitElement {
static properties = {
users: { type: Array }
};
constructor() {
super();
this.users = [];
}
async connectedCallback() {
super.connectedCallback();
const response = await fetch('/api/users');
this.users = await response.json();
}
render() {
return html`
<ul>
${this.users.map(user => html`<li>${user.name}</li>`)}
</ul>
`;
}
}
customElements.define('user-list', UserList);
Здесь fetch перехватывается Service Worker, что
позволяет:
cache-v1,
cache-v2) для управляемого обновления ресурсов.Service Worker в сочетании с Lit позволяет создать прогрессивное веб-приложение с высокой производительностью, надежностью и поддержкой офлайн-режима, сохраняя динамичность интерфейса и минимизируя задержки при повторных посещениях.