Обновить

Комментарии 8

Жалко что поддержка SyncManager реализована только в хромо-подобных браузерах.

А есть ли аналог «AdBlock'а» для ServiceWorker'ов? Чтобы можно было блокировать все посторонние процессы и разрешить запуск только выбранных?
ага, открыл список зарегистрированных, а там только ленивый сервис-воркер не прописал

Скорее всего это связано с тем, что стало модно пытаться подписать пользователей на пуш-уведомления, которые требуют установленного воркера.
К счастью, установленный воркер совсем не обязательно висит в памяти и работает постоянно. Совсем наоборот — по спецификации браузер может (активно пытается) потушить сервис воркер как только он стал не нужен (т.е. когда воркер обработал событие, на которое он подписан).

Кроме использования браузера, который это позволяет (Pale Moon), под хромоподобные можно поставить что-нибудь вроде chrome.google.com/webstore/detail/block-service-workers/ceokjgeibfjfcboemhdpkdalankbmnej
Поэтому, если у нас не было подключения и оно было восстановлено, SW немедленно выполнит эту задачу


Подскажите, а как эта антинаучная магия определяет статус подключения? Также как и window.navigator.onLine? Но оно же даёт не настоящие результаты. Т.е. правдиво реагирует только на галочку в dev-tools — online/offline.

Чтобы проверить эту функциональность, мы должны перейти в автономный режим в нашем браузере

Если не галочку в dev-tools клацать, а выдернуть шнур из роутера (роутер оставить включённым)? Это всё описанное в статье работать будет также?.. адекватно?

const cacheFiles = [
    'https://domain.ru/file/to/path.bin'
];

self.addEventListener('install', (event) => {
    console.log('[sw] installed8', event);
    caches
        .open('static')
        .then((cache) => cache.addAll(cacheFiles))
});

self.addEventListener('activate', (event) => {
    console.log('[sw] activated', event);
});

self.addEventListener('fetch', (event) => {
    event.respondWith(
        caches.match(event.request)
          .then(response => {
            if (response) {
                console.log('[sw] from cache', event.request, response);
              return response;
            } else {
              return fetch(event.request);
            }
          })
    );
});


Использую вот такой Service Worker.
  1. Воркер устанавливается(лог [sw] installed выполняется).
  2. Дожидаюсь пока файл загрузится (150мб). Вижу этот файл во вкладке Application -> Cache Storage.
  3. Перезапускаю страницу. Вижу что файл в кеше был найден(лог [sw] from cache выполняется). Ожидаю что файл загрузится моментально, а он грузится так же долго 30 сек.


Что я делаю не так? Спасибо.

Мимо проходил, но возможно виноват как раз console.log перед возвратом response. т.к. response'ы одноразовые, то его передача в console.log делает его возврат бесполезным. А дефолтное поведение при фейле обработки fetch'а - выполнить обычный запрос по сети.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации