NavigationRoute в Workbox используется для обработки
навигационных запросов в приложениях с одной страницей (SPA). Его
основная задача — перехватывать запросы на загрузку HTML-страниц и
направлять их на конкретный кэшированный ресурс, чаще всего на главный
файл приложения, например index.html. Это позволяет
приложению работать оффлайн и корректно загружать SPA-страницы при
навигации.
Для работы с NavigationRoute требуется импортировать модули
registerRoute и NavigationRoute из Workbox.
Также часто используется NetworkFirst или
CacheFirst стратегии из
workbox-strategies:
import { registerRoute, NavigationRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
registerRoute отвечает за регистрацию маршрутов.NavigationRoute фильтрует навигационные запросы.NetworkFirst — стратегия, при которой сначала идет
попытка получить ресурс из сети, а в случае ошибки используется
кэш.Основная структура создания NavigationRoute выглядит так:
const navigationHandler = new NetworkFirst({
cacheName: 'html-cache',
plugins: [
// Опциональные плагины
],
});
const navigationRoute = new NavigationRoute(navigationHandler, {
denylist: [/^\/api\//, /^\/admin\//],
allowlist: [/./],
});
registerRoute(navigationRoute);
Объяснение параметров:
/./, чтобы
разрешить все навигационные запросы по умолчанию.Выбор стратегии напрямую влияет на поведение SPA при оффлайн-доступе:
NetworkFirst Подходит для приложений с часто обновляющимся контентом:
CacheFirst Используется, когда HTML редко меняется:
StaleWhileRevalidate Комбинированный подход:
Пример использования CacheFirst:
import { CacheFirst } from 'workbox-strategies';
const navigationHandler = new CacheFirst({
cacheName: 'html-cache',
plugins: [],
});
const navigationRoute = new NavigationRoute(navigationHandler);
registerRoute(navigationRoute);
NavigationRoute позволяет точно контролировать, какие навигационные запросы обрабатываются:
Пример:
const navigationRoute = new NavigationRoute(navigationHandler, {
denylist: [
/\/api\//, // Все API-запросы
/\/admin\//, // Админские маршруты
/\.json$/ // JSON файлы
]
});
Таким образом, HTML-страницы SPA будут обрабатываться только для нужных маршрутов, а API-запросы и статические JSON-файлы останутся вне кэширования NavigationRoute.
Workbox позволяет комбинировать NavigationRoute с другими
registerRoute для ресурсов, таких как CSS, JS, изображения.
Важно регистрировать NavigationRoute после специфичных маршрутов, чтобы
он не перехватывал запросы к статическим файлам:
// Кэширование статических файлов
registerRoute(
/\.(?:js|css|png|jpg|svg)$/,
new CacheFirst({ cacheName: 'assets-cache' })
);
// Обработка навигационных запросов SPA
registerRoute(navigationRoute);
NavigationRoute — ключевой инструмент для оффлайн-доступа SPA:
Пример с плагинами:
import { ExpirationPlugin, CacheableResponsePlugin } from 'workbox-plugins';
const navigationHandler = new NetworkFirst({
cacheName: 'html-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 10,
maxAgeSeconds: 24 * 60 * 60, // 1 день
}),
new CacheableResponsePlugin({
statuses: [200],
}),
],
});
NavigationRoute предоставляет мощный инструмент для работы с HTML-навигацией в SPA, обеспечивая оффлайн-доступ и гибкую фильтрацию маршрутов. Грамотно настроенный NavigationRoute совместно с правильной стратегией кэширования повышает производительность и надежность фронтенд-приложений.