Navigation Preload — это функциональность, которая позволяет ускорить
загрузку страниц в сервис-воркерах, особенно при стратегиях кеширования
типа Network First. Она активируется на этапе установки
сервис-воркера и позволяет браузеру параллельно запрашивать ресурс
страницы, пока сервис-воркер обрабатывает событие fetch.
Это сокращает задержки, связанные с ожиданием активации воркера перед
выполнением сетевых запросов.
Для включения Navigation Preload в сервис-воркере Workbox используется метод:
workbox.navigationPreload.enable();
Этот вызов следует выполнять внутри обработчика события
activate:
self.addEventListener('activate', (event) => {
event.waitUntil(
(async () => {
if (self.registration.navigationPreload) {
await self.registration.navigationPreload.enable();
}
})()
);
});
Ключевые моменты:
self.registration.navigationPreload необходима
для совместимости с браузерами, которые не поддерживают Navigation
Preload.После активации Navigation Preload его можно использовать в маршрутах Workbox для стратегий типа Network First, чтобы ускорить получение основной HTML-страницы.
Пример настройки маршрута:
workbox.routing.registerRoute(
({ request }) => request.mode === 'navigate',
new workbox.strategies.NetworkFirst({
cacheName: 'pages-cache',
plugins: [
{
// Плагин для обработки navigation preload
fetchDidFail: async ({ request }) => {
console.log('Network request failed for:', request.url);
}
}
]
})
);
Внутри стратегии NetworkFirst Navigation Preload
используется автоматически, если он был включен на активации. При этом
запрос страницы выполняется параллельно с обработкой события
fetch, что минимизирует задержки.
Navigation Preload поддерживает конфигурацию заголовков запроса. В
Workbox это делается через объект preloadResponse:
self.addEventListener('fetch', (event) => {
event.respondWith(
(async () => {
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
return preloadResponse;
}
return fetch(event.request);
})()
);
});
Особенности:
event.preloadResponse возвращает промис, который
резолвится в Response, если Navigation Preload
сработал, или undefined, если запрос не был
предзагружен.NetworkFirst использовать
предзагруженный ответ вместо дополнительного сетевого запроса.Navigation Preload особенно полезен вместе с кэшированием:
Пример интеграции:
workbox.routing.registerRoute(
({ request }) => request.mode === 'navigate',
async ({ event }) => {
const cache = await caches.open('pages-cache');
const cachedResponse = await cache.match(event.request);
if (cachedResponse) {
return cachedResponse;
}
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
cache.put(event.request, preloadResponse.clone());
return preloadResponse;
}
const networkResponse = await fetch(event.request);
cache.put(event.request, networkResponse.clone());
return networkResponse;
}
);
Преимущества такой схемы:
request.mode === 'navigate').Navigation Preload в Workbox позволяет строить быстрые и отзывчивые Progressive Web App, минимизируя задержки при загрузке страниц и обеспечивая эффективное сочетание сетевых запросов и кэширования.