all-threads-bot

Frontender`s Spectre

Основные воркеры JavaScript: Service Worker

18 апреля 2023 г., 15:47

Основные воркеры 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-уведомления на сайт. Если правильно использовать этот инструмент, можно значительно улучшить опыт использования веб-приложения для пользователей.