Как принудительно загрузить текущую версию автономного веб-приложения? - PullRequest
0 голосов
/ 27 ноября 2018

Я делаю крошечное автономное веб-приложение / PWA.Он предназначен для того, чтобы открываться с иконки на главном экране и имитировать обычное приложение, полностью загружаясь из кеша в автономном режиме.

Приложение написано с использованием Vue, и для выполнения вышесказанного я просто использую их шаблон PWA ивсе, что он генерирует.Насколько мне известно, для этого устанавливается workbox с использованием плагина GenerateSW для предварительного кэширования всего в сборке Webpack и регистрации его с использованием register-service-worker .То есть из коробки у меня довольно мало контроля над мелкими деталями, это должно быть готовое решение.

Тем не менее, я не уверен, как на самом деле загрузить новую сборку приложения, когдаэто доступно.Вышесказанное может обнаружить это - сгенерированный файл регистрации SW с моими изменениями выглядит следующим образом:

import debug from 'debug';
import { register } from 'register-service-worker';


if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready(...args) {
      log('App is being served from cache by a service worker.\n', ...args);
    },
    cached(...args) {
      log('Content has been cached for offline use.', ...args);
    },
    updated(...args) {
      log('New content is available; please refresh.', ...args);
    },
    offline(...args) {
      log('No internet connection found. App is running in offline mode.', ...args);
    },
    error(error, ...args) {
      log('Error during service worker registration:', error, ...args);
    }
  });
}

Когда я делаю новую сборку приложения и обновляю приложение в браузере, updated()обратный вызов выполняется, но больше ничего не делается.Когда я попытался добавить:

window.location.reload(true);

, что должно быть принудительным обновлением, я просто получил цикл обновления.Я предполагаю, что это связано с тем, что кэш рабочего сервиса полностью независим от кэша браузера и не подвержен влиянию таких вещей, как описанные выше или Ctrl + F5 .(Что делает «пожалуйста, обновите» довольно вводящим в заблуждение.)

Поскольку это будет имитировать нативное приложение, а оно должно быть простым инструментом для ведения бизнеса, мне не нужно делатьничего более сложного, чем немедленная перезагрузка в новую версию приложения, когда доступно обновление.Как мне этого добиться?

1 Ответ

0 голосов
/ 29 ноября 2018

Хорошо, я наблюдал за поведением, что обновление происходит автоматически, просто неясно, какова точная последовательность событий.Я попытаюсь описать мое лучшее понимание того, как работает созданный сервисный работник в установленном сценарии PWA.Для простоты я буду говорить в терминах «версий приложений», потому что ментальная модель этого ближе к тому, как работают приложения, а не веб-страницы:

  • Вы развертываете v1 своего приложения на сервере, устанавливаете/ предварительно кэшируйте его на устройстве и запускайте в первый раз.
  • Когда вы приостанавливаете и возобновляете свое приложение, оно вообще не попадает на ваши серверы.
  • Приложение проверит наличиеобновлять при холодном запуске или при перезагрузке страницы, т. е. с помощью выпадающего жеста на Android.
    (возможно, также периодически, поскольку кэшированная версия устареет, но я этого не проверял.)
  • Допустим, вы уже развернули v2 своего приложения.Перезагрузка экземпляра v1 приложения найдет это обновление и выполнит его предварительную кеширование.
    (Одна из причин, по которой побуждение пользователя к перезагрузке, похоже, не имеет смысла. Что бы ни предполагалось для перезагрузки, это уже произошло.)
  • Перезагрузка экземпляр v1 снова ничего не делает.Приложение продолжает работать между перезагрузками, и вы просто получите v1.
    (Причина номер два, почему побуждение пользователя к перезагрузке бессмысленно - это не то, что заставляет загружать новую версию приложения.)
  • Однако, в следующий раз, когда вы начнете холодный запуск вашего приложения - например, сбросьте его с помощью переключателя задач и снова откройте - v2 вашего приложения будет загружено, и я предполагаю, что v1 будет очищениз.То есть ваше приложение должно быть полностью закрыто, чтобы загрузить обновление.

Короче говоря, для обновления приложения с v1 до v2 необходимо выполнить следующие шаги:

  1. Развертывание v2 на сервере
  2. Обновление экземпляра v1 на устройстве или выключение и повторное открытие приложения.
  3. Завершение работы и повторное открытие приложения (снова).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...