Как работает сервисный работник? - PullRequest
0 голосов
/ 03 октября 2018

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

Теперь это мой serviceworker.js file

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();
    });
  }
}

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

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

1 Ответ

0 голосов
/ 04 октября 2018

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

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

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

К Создание PWA в реальном времени с React :

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

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

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

...