Service Worker — это скрипт, который браузер запускает отдельно от веб-страницы, позволяя обрабатывать сетевые запросы, управлять кэшированием и обеспечивать работу приложения в оффлайн-режиме. В контексте приложений на Mithril он играет ключевую роль для повышения производительности и устойчивости к сетевым сбоям.
Для подключения Service Worker используется метод
navigator.serviceWorker.register. Обычно регистрация
выполняется в основном скрипте приложения после загрузки DOM:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker зарегистрирован с областью:', registration.scope);
})
.catch(error => {
console.error('Ошибка регистрации Service Worker:', error);
});
}
Ключевые моменты:
serviceWorker в navigator
обязательна, чтобы избежать ошибок в браузерах, которые не поддерживают
эту технологию.'/sw.js' должен быть относительно корня сайта и
соответствовать правилам области действия (scope).Файл sw.js содержит логику кэширования, обработки
запросов и событий жизненного цикла. Основные события:
install — установка Service Worker, обычно используется
для предварительного кэширования ресурсов.activate — активация нового Service Worker и очистка
устаревших кэшей.fetch — перехват сетевых запросов для отдачи
закэшированных ресурсов или получения их с сервера.Пример базового Service Worker:
const CACHE_NAME = 'mithril-app-v1';
const ASSETS_TO_CACHE = [
'/',
'/index.html',
'/app.js',
'/style.css'
];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => cache.addAll(ASSETS_TO_CACHE))
);
self.skipWaiting();
});
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(keys =>
Promise.all(
keys.filter(key => key !== CACHE_NAME)
.map(key => caches.delete(key))
)
)
);
self.clients.claim();
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(cachedResponse => cachedResponse || fetch(event.request))
);
});
Важные аспекты кэширования:
Стратегии кэширования:
Версионирование кэша:
activate.Динамическое кэширование:
caches.put.Пример динамического кэширования данных:
self.addEventListener('fetch', event => {
if (event.request.url.includes('/api/')) {
event.respondWith(
fetch(event.request)
.then(response => {
return caches.open(CACHE_NAME).then(cache => {
cache.put(event.request, response.clone());
return response;
});
})
.catch(() => caches.match(event.request))
);
}
});
В Mithril Service Worker работает независимо от виртуального DOM. Для максимальной пользы рекомендуется:
app.js, стили, шаблоны).С Service Worker можно полностью эмулировать оффлайн-режим. Для Mithril это означает:
Service Workers позволяют создать быстрые, надежные и оффлайн-готовые приложения на Mithril, обеспечивая кэширование, контроль версий и улучшенное взаимодействие с сетью.