Вопрос или проблема
У меня есть приложение на Angular с @angular/pwa
Вот ngsw-config.json
{
"$schema": "../../node_modules/@angular/service-worker/config/schema.json",
"index": "/index.html",
"navigationRequestStrategy": "freshness",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": [
"/favicon.ico",
"/index.html",
"/manifest.webmanifest",
"/*.css",
"/*.js"
]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": [
"/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"
]
}
}
],
"dataGroups": [
{
"name": "api",
"urls": ["/api"],
"cacheConfig": {
"maxSize": 1000,
"maxAge": "30d"
}
}
]
}
Как же так, если я потерял соединение и вернулся на страницы, которые я использовал, всё хорошо и работает
Но проблема возникает, когда я обновляю страницу, я получаю ошибку 504, и не понимаю, почему, ведь страницы могут работать оффлайн, если я не обновляю. Это происходит как для страниц, требующих вызова API, так и для статических страниц. У меня включен SSR в проекте, и эти статические страницы предварительно отрендерены.
Ответ или решение
Проблема, с которой вы столкнулись, связана с получением ошибки 504 (Gateway Timeout) при обновлении страницы вашего Angular PWA, несмотря на то что приложение работает корректно в офлайн-режиме. Давайте разберём основные моменты, которые могут быть причиной возникновения данной проблемы.
Общее Описание
Ваше Angular приложение настроено с использованием @angular/pwa
, что гарантирует его работу в офлайн-режиме благодаря использованию Service Worker. Ваша конфигурация ngsw-config.json
выглядит вполне стандартно, включая группы ресурсов и групп данных. Однако, ошибка 504 возникает при попытке обновления страницы, когда интернет-соединение отсутствует.
Причины Ошибки 504
-
Работа Service Worker:
Service Worker кеширует запросы к API. Когда вы работаете в офлайн-режиме, запросы могут быть успешными благодаря кешированию. Но при обновлении страницы происходит повторный запрос к серверу, и если он недоступен, вы получаете 504 ошибку. Ваша конфигурация не содержит задания для обработки кэша в случае отсутствия соединения. -
Настройка Navigation Request Strategy:
Вы используете стратегиюfreshness
, которая подразумевает, что каждый раз, когда пользователь запрашивает страницу, Service Worker сначала пытается получить свежую версию из сети. Если нет соединения, он не сможет получить её и выдаст ошибку. -
Кеширование API Запросов:
ВашаdataGroups
часть настроена на кэширование URL/api
. Если запросы к этому URL не проходят, и сеть отсутствует, это также ведёт к ошибкам при обновлении страниц, так как Service Worker попытается сначала обратиться за новыми данными к серверу. -
Необработанные Статические Страницы:
Даже если статические страницы предоставляются из кэша, при первой попытке обновления они всё равно могут выдавать запрос, и если этот запрос не завершается, вы снова сталкиваетесь с ошибкой.
Рекомендации по Решению Проблемы
-
Изменение Стратегии Кеширования:
Рассмотрите возможность изменения настройки дляnavigationRequestStrategy
наperformance
илиprefer-cache
, что позволит вашим страницам больше полагаться на кэшированный контент в момент отсутствия интернет-соединения."navigationRequestStrategy": "performance"
-
Логика Обработки Запросов:
Убедитесь, что запросы к вашему API имеют варианты обработки, если сервис недоступен. Используйте механизм исключений и отображайте сообщения об ошибках пользователю. -
Кэширование статических ресурсов:
Убедитесь, что, даже если у вас есть серверный рендеринг (SSR), ваши статические ресурсы корректно кешируются, чтобы их всегда можно было предоставить пользователю из Service Worker. -
Проверка и Мониторинг:
Запустите тестирование вашего приложения с инструментами разработки, такими как Chrome DevTools, чтобы понять поведение вашего Service Worker в различных сетевых условиях. Убедитесь, что ваши статические страницы и API корректно кэшируются и доступны в офлайн-режиме. -
Документация Angular Service Worker:
Ознакомьтесь с документацией Angular Service Worker, чтобы лучше понять механизмы, доступные для обработки кеша и офлайн-запросов.
Заключение
Ваше приложение может работать в офлайн-режиме, но ошибки типа 504 возникают из-за попыток запроса к серверу при обновлении страниц. Обновление конфигурации Service Worker и логики обработки запросов может помочь устранить эту проблему и улучшить пользовательский опыт. Постоянно наблюдайте за сетью и настройками кеша для обеспечения максимально эффективной работы вашего PWA.