EN · DE · RU · FR · ES

#2750: serviceWorker.js

projectforge-webapp/src/serviceWorker.js Тип: JavaScript/React · Роль: Компонент · Источник: projectforge-webapp/src/serviceWorker.js 131 строка · 92 кода · 28 комментариев · 11 пустых
Сервис-воркер PWA для офлайн-кэширования, фоновой синхронизации и возможностей прогрессивного веб-приложения.

Структура кода

Экспорт: register, unregister

Исходный код (сокращённый)

// Это позволяет приложению загружаться быстрее при последующих посещениях в продакшене и даёт
// ему офлайн-возможности. Однако это также означает, что разработчики (и пользователи)
// увидят развёрнутые обновления только при последующих посещениях страницы, после того как все
// существующие вкладки, открытые на странице, будут закрыты, поскольку ранее кэшированные
// ресурсы обновляются в фоновом режиме.

// Чтобы узнать больше о преимуществах этой модели и инструкциях по
// включению, прочитайте http://bit.ly/CRA-PWA

const isLocalhost = Boolean(
  window.location.hostname === 'localhost' ||
    // [::1] — это адрес localhost для IPv6.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 считается localhost для IPv4.
    window.location.hostname.match(
      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

export function register(config) {
if (import.meta.env.PROD && 'serviceWorker' in navigator) {
  const publicUrl = new URL(import.meta.env.BASE_URL, window.location.href);
  if (publicUrl.origin !== window.location.origin) {
    return;
  }
  window.addEventListener('load', () => {
    const swUrl = `${import.meta.env.BASE_URL}service-worker.js`;

      if (isLocalhost) {
        // Запуск на localhost. Проверим, существует ли ещё сервис-воркер.
        checkValidServiceWorker(swUrl, config);

        // Добавим дополнительное логирование на localhost, указывающее разработчикам на
        // документацию по сервис-воркеру/PWA.
        navigator.serviceWorker.ready.then(() => {
          console.log(
            'Это веб-приложение обслуживается сервис-воркером с приоритетом кэша. ' +
              'Чтобы узнать больше, посетите http://bit.ly/CRA-PWA'
          );
        });
      } else {
        // Не localhost. Просто регистрируем сервис-воркер
        registerValidSW(swUrl, config);
      }
    });
  }
}

function registerValidSW(swUrl, config) {
  navigator.serviceWorker
    .register(swUrl)
    .then(registration => {
      registration.onupdatefound = () => {
        const installingWorker = registration.installing;
        if (installingWorker == null) {
          return;
        }
        installingWorker.onstatechange = () => {
          if (installingWorker.state === 'installed') {
            if (navigator.serviceWorker.controller) {
              // На этом этапе обновлённое предварительно кэшированное содержимое было загружено,
              // но предыдущий сервис-воркер будет продолжать обслуживать старое содержимое,
              // пока все вкладки клиента не будут закрыты.
              console.log(
                'Доступен новый контент, который будет использован, когда все ' +
                  'вкладки этой страницы будут закрыты. См. http://bit.ly/CRA-PWA.'
              );

              // Выполнение обратного вызова
              if (config && config.onUpdate) {
                config.onUpdate(registration);
              }
            } else {
              // На этом этапе всё было предварительно кэшировано.
              // Это идеальное время, чтобы показать сообщение
              // "Контент кэширован для офлайн-использования."
              console.log('Контент кэширован для офлайн-использования.');

              // Выполнение обратного вызова
              if (config && config.onSuccess) {
                config.onSuccess(registration);
              }
            }
          }
        };
      };
    })
    .catch(error => {
      console.error('Ошибка при регистрации сервис-воркера:', error);
    });
}

function checkValidServiceWorker(swUrl, config) {
  // Проверяем, можно ли найти сервис-воркер. Если нет — перезагружаем страницу.
  fetch(swUrl)
    .then(response => {
      // Убеждаемся, что сервис-воркер существует и что мы действительно получаем JS-файл.
      const contentType = response.headers.get('content-type');
      if (
        response.status === 404 ||
        (contentType != null && contentType.indexOf('javascript') === -1)
      ) {
        // Сервис-воркер не найден. Вероятно, другое приложение. Перезагружаем страницу.
        navigator.serviceWorker.ready.then(registration => {
          registration.unregister().then(() => {
            window.location.reload();
          });
        });
      } else {
        // Сервис-воркер найден. Продолжаем как обычно.
        registerValidSW(swUrl, config);
      }
    })
    .catch(() => {
      console.log(
        'Интернет-соединение не найдено. Приложение работает в офлайн-режиме.'
      );
    });
}
// ... (сокращено, всего 128 строк)

История Git

bf988bc6d Устранение 43 уязвимостей npm: react-scripts→Vite, ESLint 9, очистка зависимостей, исправления ошибок
dcbcb3a34 применение eslint к файлам redux
b265eb093 начальный коммит для веб-приложения