Как обновить PWA на основе Reactjs до новой версии?

Я разрабатываю приложение на основе reactjs. Я также сделал service-worker настройки на нем. После add to home screen приложение никогда не проверяет сервер на наличие новых обновлений.

Я также пробовал:

window.location.reload(true);

Но он не обновляет новую версию.

Я использую сервер Apache для обслуживания папки build, и для обновления я получаю новую сборку своего проекта и обслуживаю ее на сервере Apache.


person Abbas Habibnejad    schedule 10.07.2019    source источник
comment
Вы можете проверить этот сообщение, это показать базовый способ обновления PWA до более новой версии с помощью ServiceWorker, уведомления об обновлении PWA и прослушивателя событий.   -  person Mr.Rebot    schedule 17.07.2019
comment
Спасибо. Это очень полезно и полно.   -  person Abbas Habibnejad    schedule 22.07.2019


Ответы (2)


Я наконец решил свою проблему через два дня. Проблема была в service-worker файле. Мне пришлось добавить прослушиватель событий, если страница перезагрузилась, а файлы сервера изменились, чтобы он обновил файлы.

Поэтому я добавил этот раздел в serviceWorker.js в функции register:

window.addEventListener('activate', function(event) {
      event.waitUntil(
          caches.keys().then(function(cacheNames) {
              return Promise.all(
                  cacheNames.filter(function(cacheName) {
                      // Return true if you want to remove this cache,
                      // but remember that caches are shared across
                      // the whole origin
                  }).map(function(cacheName) {
                      return caches.delete(cacheName);
                  })
              );
          })
      );
    });

Только не забудь. Этот вызов слушателя при перезагрузке страницы. Поэтому я делаю службу API, чтобы проверить, есть ли новая версия или нет. если есть новая версия, необходимо перезагрузить страницу, чтобы получить новые файлы.

этот вопрос был очень полезен: Как очистить кеш работника службы?

Обновление (1 декабря 2019 г.):

Я нашел лучший способ обновить новый PWA. На самом деле этот способ (выше) не работает на iOS 13. Поэтому я решил проверить обновление по API. PWA Отправьте текущую версию в API, и если будет выпущена новая версия, в PWA мы должны удалить все кеши:

caches.keys().then(function(names) {
    for (let name of names)
        caches.delete(name);
});

И после этого перезагрузите приложение:

window.location.href = "./";

После перезагрузки из-за отсутствия кеша для загрузки страниц в автономном режиме, поэтому PWA проверит сервер и получит новую версию.

person Abbas Habibnejad    schedule 11.07.2019
comment
Привет. Я столкнулся с той же проблемой и просто хотел понять ваше обновление 2019 года. Куда вы вставили этот код? Какой API проверяет наличие новой версии? Спасибо! - person AlexM88; 03.01.2020
comment
Привет, Алекс. Собственно, у меня есть функция проверки в каждом запросе по API. в этой функции я проверяю все требования. поэтому я отправляю имя версии по запросу заголовка и по API, я сначала проверяю действительность версии, и если она недействительна, в ответ я устанавливаю статус ОБНОВЛЕНИЕ. поэтому в проекте реагирования при каждом ответе я проверяю, равен ли статус UPDATE {1.clear cache; 2. перезагрузите страницу, чтобы получить новую версию}. например: в реактивном проекте у нас есть переменная для version_name, равная 1.0.0. в API version_name равно 1.0.1 . в этом сценарии наш ответ должен быть: {status=UPDATE}. извините за мой английский - person Abbas Habibnejad; 04.01.2020

эта работа для меня: src/index.tsx

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://cra.link/PWA
serviceWorkerRegistration.register({
  onUpdate: (e) => {
    const { waiting: { postMessage = null } = {} as any, update } = e || {};
    if (postMessage) {
      postMessage({ type: 'SKIP_WAITING' });
    }
    update().then(() => {
      window.location.reload();
    });
  },
});
person Salu Escalante    schedule 02.06.2021