РАБОЧИЙ СЛУЖБЫ: запрос предварительной загрузки навигации работника службы завершился с ошибкой сети: net :: ERR_INTERNET_DISCONNECTED в Chrome 89

У меня проблема с моим сервисным работником.

В настоящее время я реализую автономную функциональность с сайтом offline.html, который будет отображаться в случае сбоя сети. Я реализовал предварительную загрузку навигации, как описано здесь: https://developers.google.com/web/updates/2017/02/navigation-preload#activating_navigation_preload

Вот моя установка EventListener: skipWaiting () и инициализация нового кеша.

const version = 'v.1.2.3'
const CACHE_NAME = '::static-cache'
const urlsToCache = ['index~offline.html', 'favicon-512.png']

self.addEventListener('install', function(event) {
    self.skipWaiting()
    event.waitUntil(
        caches
            .open(version + CACHE_NAME)
            .then(function(cache) {
                return cache.addAll(urlsToCache)
            })
            .then(function() {
                console.log('WORKER: install completed')
            })
    )
})

Вот моя активация EventListener, где я обнаружил функцию navigationPreload и включил ее. После этого проверяю старые кеши и удаляю их.

self.addEventListener('activate', event => {
    console.log('WORKER: activated')
    event.waitUntil(
        (async function() {
            // Feature-detect
            if (self.registration.navigationPreload) {
                // Enable navigation preloads!
                console.log('WORKER: Enable navigation preloads')
                await self.registration.navigationPreload.enable()
            }
        })().then(
            caches.keys().then(function(cacheNames) {
                cacheNames.forEach(function(cacheName) {
                    if (cacheName !== version + CACHE_NAME) {
                        caches.delete(cacheName)
                        console.log(cacheName + ' CACHE deleted')
                    }
                })
            })
        )
    )
})

Это мой прослушиватель событий fetch

self.addEventListener('fetch', event => {
    const { request } = event

    // Always bypass for range requests, due to browser bugs
    if (request.headers.has('range')) return
    event.respondWith(
        (async function() {
            // Try to get from the cache:
            const cachedResponse = await caches.match(request)
            if (cachedResponse) return cachedResponse

            try {
                const response = await event.preloadResponse
                if (response) return response

                // Otherwise, get from the network
                return await fetch(request)
            } catch (err) {
                // If this was a navigation, show the offline page:
                if (request.mode === 'navigate') {
                    console.log('Err: ',err)
                    console.log('Request: ', request)
                    return caches.match('index~offline.html')
                }

                // Otherwise throw
                throw err
            }
        })()
    )
})

Теперь моя проблема: на моем локальном компьютере на локальном хосте все работает так, как должно. Если сеть отключена, пользователю доставляется страница index ~ offline.html. Если я разверну на своем тестовом сервере, все будет работать так, как ожидалось, за исключением странного сообщения об ошибке в Chrome при обычном просмотре (не в автономном режиме):

The service worker navigation preload request failed with network error: net::ERR_INTERNET_DISCONNECTED.

Я зарегистрировал ошибку и запрос на получение дополнительной информации Ошибка:

DOMException: The service worker navigation preload request failed with a network error.

Запрос:  Запрос

Это странно, потому что каким-то образом index.html запрашивается независимо от того, какой сайт загружен.

Дополнительная информация это происходит в Chrome 89, в Chrome 88 все в порядке (я проверял в браузере). Я только что заметил, что в Chrome 89 изменилось определение pwa в автономном режиме ... https://developer.chrome.com/blog/improved-pwa-offline-detection/

кто-нибудь знает, в чем может быть проблема?

Обновление. Я восстанавливаю проблему здесь, чтобы каждый мог ее проверить: https://dreamy-leavitt-bd4f0e.netlify.app/


person veduardo    schedule 26.03.2021    source источник


Ответы (1)


Эта ошибка напрямую вызвана улучшенным автономным обнаружением pwa, с которым вы связались: https://developer.chrome.com/blog/improved-pwa-offline-detection/

Браузер подделывает автономный контекст и пытается запросить start_url вашего манифеста, например index.html, указанный в вашем https://dreamy-leavitt-bd4f0e.netlify.app/site.webmanifest

Это необходимо для того, чтобы убедиться, что ваш сервис-воркер действительно возвращает действительный ответ 200 в этой ситуации, то есть действительный кешированный ответ для вашей страницы index ~ offline.html.

Ошибка, о которой вы конкретно спрашиваете, относится к части await event.preloadResponse, и ее, по-видимому, нельзя подавить.

Вызов await fetch вызывает аналогичную ошибку, но ее можно подавить, только не console.log в разделе catch.

Надеюсь, что Chrome не будет отображать эту ошибку из ответов предварительной загрузки в будущем при автономном обнаружении pwa, поскольку это бесполезно сбивает с толку.

person James Wheare    schedule 05.04.2021
comment
В chrome 90.0.4422.0 это, похоже, исправлено. Я больше не вижу ошибки. Это, вероятно, ответственный за фиксацию хром / хром. - person mihi; 17.05.2021