serviceWorker.jsЭкспорт: 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 строк)
bf988bc6d Устранение 43 уязвимостей npm: react-scripts→Vite, ESLint 9, очистка зависимостей, исправления ошибок dcbcb3a34 применение eslint к файлам redux b265eb093 начальный коммит для веб-приложения