Как работает сервис воркер?

Я новичок в прогрессивных веб-приложениях. Я прошел через это отличное руководство и настройка для моего приложения PWA (прогрессивный веб) React.

Теперь это мой файл serviceworker.js.

const isLocalhost = Boolean(
  window.location.hostname === 'localhost' ||
    window.location.hostname === '[::1]' ||
    window.location.hostname.match(
      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

export default function register() {
  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
    if (publicUrl.origin !== window.location.origin) {
      return;
    }

    window.addEventListener('load', () => {
      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;

      if (isLocalhost) {
        checkValidServiceWorker(swUrl);
        navigator.serviceWorker.ready.then(() => {
        });
      } else {
        registerValidSW(swUrl);
      }
    });
  }
}

function registerValidSW(swUrl) {
  navigator.serviceWorker
    .register(swUrl)
    .then(registration => {
      registration.onupdatefound = () => {
        const installingWorker = registration.installing;
        installingWorker.onstatechange = () => {
          if (installingWorker.state === 'installed') {
            if (navigator.serviceWorker.controller) {
              console.log('New content is available; please refresh.');
            } else {
              console.log('Content is cached for offline use.');
            }
          }
        };
      };
    })
    .catch(error => {
      console.error('Error during service worker registration:', error);
    });
}

function checkValidServiceWorker(swUrl) {
  fetch(swUrl)
    .then(response => {
      if (
        response.status === 404 ||
        response.headers.get('content-type').indexOf('javascript') === -1
      ) {
        navigator.serviceWorker.ready.then(registration => {
          registration.unregister().then(() => {
            window.location.reload();
          });
        });
      } else {
        registerValidSW(swUrl);
      }
    })
    .catch(() => {
      console.log(
        'No internet connection found. App is running in offline mode.'
      );
    });
}

export function unregister() {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.ready.then(registration => {
      registration.unregister();
    });
  }
}

Но никак не могли понять, как это работает? Может ли кто-нибудь помочь, что здесь делают регистрация, отмена регистрации и другие функции?

Пожалуйста помоги!!!


person Dark Knight    schedule 03.10.2018    source источник


Ответы (1)


На основе документации:

Сервисный работник - это разновидность веб-работника. По сути, это файл JavaScript, который запускается отдельно от основного потока браузера, перехватывает сетевые запросы, кэширует или извлекает ресурсы из кеша и доставляет push-сообщения.

Из приведенного выше примера кода вы используете среду React для создания PWA с create-react-app. Это устранит все это, позволив разработчикам создавать приложения React с небольшой конфигурацией сборки или без нее.

Чтобы создать PWA в реальном времени с помощью React:

Код сервисного работника в основном регистрирует сервисного работника для приложения React. Сначала мы проверяем, обслуживается ли приложение с локального хоста через значение isLocalhost const, которое вернет либо истинное, либо ложное значение. Функция register() помогает зарегистрировать сервисного воркера в приложении React, только если оно находится в производственном режиме и если браузер поддерживает сервисных воркеров.

Функция registerValidSW(), которая зарегистрирует действующего сервис-воркера и будет отвечать за состояние, если он установлен. checkValidServiceWorker() проверит, можно ли найти сервис-воркер. Это гарантирует, что сервис-воркер существует и что мы действительно получаем JS-файл.

Функция unregister() помогает отменить регистрацию сервис-воркера.

person jess    schedule 04.10.2018
comment
Спасибо за ответ. В этом форуме никто не отвечает - person Dark Knight; 04.10.2018