Основные воркеры JavaScript: Service Worker
Service worker фактически выполняет роль прокси-сервера, находящегося между веб-приложением и браузером, а также сетью (если доступна). Он позволяет (кроме прочего) описывать корректное поведение веб-приложения в режиме офлайн, перехватывать запросы сети и принимать соответствующие меры, основываясь на доступности сети, и обновлять данные, находящиеся на сервере при доступе к нему.
Service Worker - это скриптовый файл JavaScript, который работает в фоновом режиме и может управлять кэшированием, сетевыми запросами и другими аспектами жизненного цикла веб-приложения. Этот инструмент позволяет создавать приложения, которые работают быстрее и более надежно, даже при низкой скорости интернет-соединения или отсутствии соединения вообще.
Service Worker работает в отдельном потоке браузера и не имеет доступа к DOM. Вместо этого он использует специальный API, который позволяет обрабатывать запросы, выполнять кэширование и манипулировать событиями веб-приложения. Service Worker может работать независимо от того, открыта ли страница или нет, и может быть использован для кэширования статических файлов, таких как HTML, CSS, JS, изображения и другие ресурсы, чтобы они могли быть быстро загружены при последующих запросах.
Для того, чтобы использовать Service Worker, необходимо сначала зарегистрировать его веб-приложением. Это можно сделать с помощью следующего кода:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(function(registration) {
console.log('Service worker registered:', registration);
})
.catch(function(error) {
console.log('Service worker registration failed:', error);
});
}
После регистрации Service Worker начнет слушать события жизненного цикла веб-приложения, такие как установка, активация и деактивация. В процессе установки Service Worker может сохранять необходимые файлы в кэш, используя методы из объекта Cache
из стандартного API Cache Storage
.
var CACHE_NAME = 'my-site-cache-v1';
var urlsToCache = [
'/',
'/styles/main.css',
'/script/main.js',
'/images/logo.png'
];
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});
После установки Service Worker перейдет в стадию активации. В этот момент можно произвести очистку устаревших кэшированных файлов, обновить кэш, добавить дополнительную логику и т.д.
self.addEventListener('activate', function(event) {
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.filter(function(cacheName) {
return cacheName.startsWith('my-site-') &&
cacheName != CACHE_NAME;
}).map(function(cacheName) {
return caches.delete(cacheName);
})
);
})
);
В Service Worker можно добавить логику для обработки событий сетевых запросов, что позволяет использовать кэшированные данные, когда сетевой запрос не удался. Для этого необходимо зарегистрировать обработчик событий fetch
.
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Если данные в кэше есть, то вернуть их
if (response) {
return response;
}
// Если данных в кэше нет, выполнить запрос к сети
return fetch(event.request)
.then(function(response) {
// Кэшировать данные, полученные из сети
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
});
})
);
});
С помощью Service Worker можно также добавлять push-уведомления
на сайт, что позволяет сообщать пользователям о новых сообщениях, даже когда они находятся не на сайте.
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
var title = 'Push Notification';
var body = 'You have a new message.';
var icon = '/images/icon-192x192.png';
var tag = 'simple-push-demo-notification-tag';
event.waitUntil(
self.registration.showNotification(title, {
body: body,
icon: icon,
tag: tag
})
);
});
В целом, Service Worker представляет собой мощный инструмент для улучшения производительности и надежности веб-приложений. Он позволяет работать с кэшем и обрабатывать события сетевых запросов, а также добавлять push-уведомления на сайт. Если правильно использовать этот инструмент, можно значительно улучшить опыт использования веб-приложения для пользователей.