Как обрабатывать релизы с помощью сервисного работника, который использует API? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующий сценарий:

  • Веб-приложение с сервисным работником (рабочий ящик)
  • API, который использует веб-приложение

Как я могу обрабатывать изменения в API в веб-приложении? Важно принимать во внимание жизненный цикл работника службы. Работник службы будет продолжать использовать предыдущую версию до тех пор, пока сеть не будет перезагружена, поэтому пользователь может использовать устаревшие конечные точки API или пропустить новые обязательные параметры.

В настоящее время я перезагружаю страницу, как только устанавливается новая версия, но кажется, что она работает не полностью, а также не очень оптимально:

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js').then(function (registration) {
        console.log('Service worker registered')
        setInterval(() => {
            console.log('Checking for updates');
            registration.update();
        }, 1000 * 60 * 60); // Checking for updates every hour

        if (!navigator.serviceWorker.controller) { // New user with no service worker
            return;
        }

        var preventDevToolsReloadLoop;
        navigator.serviceWorker.addEventListener('controllerchange', function (event) { // This event is called when a new sw is installed
            if (preventDevToolsReloadLoop) return; // Ensure refresh is only called once. This works around a bug in "force update on reload" in chrome tools.
            preventDevToolsReloadLoop = true;
            console.log('Controller loaded');
            window.location.reload();
        });
    });
} else {
    console.log('Service worker not activated')
}

sw.js выглядит так:

importScripts('/js/workbox.4c4f5ca6.js')


workbox.precaching.precacheAndRoute([ /*Routes...*/ ]);

workbox.clientsClaim()
workbox.skipWaiting()


workbox.routing.registerRoute(new RegExp('/js/.*'), 
workbox.strategies.cacheFirst({}), 'GET')

workbox.routing.registerRoute(new RegExp('/.*'), 
workbox.strategies.networkFirst({}), 'GET')
...