Ответ 1
TL; DR: Я определил по крайней мере две проблемы, вызвавшие поломку в моем случае; вы можете использовать этот скрипт сборки, чтобы попробовать мои исправления и посмотреть, как приложение работает в автономном режиме здесь. Требуются дополнительные тесты и запросы на тяну.
Хотя мне не удалось найти документальный ответ, вот что мне удалось найти, ngsw-worker.js
файл ngsw-worker.js
, а также прочитав историю фиксации @angular/service-worker
.
Новый подход ServiceWorkerModule
к "маршрутизации" заключается в том, чтобы выполнить любой запрос "навигации" (т.е. handleFetch
маршрут в том же домене) и повторно запустить метод handleFetch
, но теперь указывая на запрос index.html
(источник). Это должно работать нормально, учитывая, что SPA должен иметь возможность перенаправлять URL-адрес после того, как он восстановил свои кешированные файлы для индекса.
Поэтому проблемы, которые приводят к сбою моего сайта выше, когда он отключен, не должны быть напрямую связаны с маршрутизацией, и я нашел 2 до сих пор. Исправление их с помощью обходного пути позволило мне заставить мое приложение работать в основном, как и ожидалось. С этапами репликации в исходном вопросе cityaq теперь работает, а я воспроизвел оригинальный, неудачный сайт в cityaq-sw-issue.
Проблемы:
-
Hosted версии Angular app, где флаг
--base-href
устанавливается из CLI, перечисляет абсолютные URL-адреса для ресурсов их сервис-работников. При сравнении запросов с этими ресурсамиngsw-worker.js
ожидает относительных URL-адресов -
Из 3 доступных "состояний", с
ngsw-worker.js
может работатьngsw-worker.js
, по моему опыту,EXISTING_CLIENTS_ONLY
кажется, поставлено неверно.- источник 1, источник 2
- Я менее уверен в этом изменении, потому что я не смог последовательно понять, что вызывает это состояние. Однако, если &, когда рабочий-сервис входит в это состояние,
ngsw-worker.js
больше не будет пытаться извлекать кешированные ресурсы (источник), а в моем тестировании подngsw-worker.js
"правильными" обстоятельствами приложение все равно входит в это состояние даже когда единственное изменение - это удаление интернет-соединения
В то время как я собрал PR для проблемы № 1 и дождался некоторой помощи в понимании проблемы №2, я использую скрипт сборки для обхода, чтобы изменить ngsw-worker.js
после его создания. Предупреждение: оно уродливо и определенно изменяет предполагаемое "безопасное" поведение установки EXISTING_CLIENTS_ONLY
. Однако для моего приложения он позволяет корректно выполнять автономную работу при запуске локально (http-server
) и развертывании в реальном URL (страницы GitHub, в моем случае).
Чтобы использовать обходной путь: (Угловой 5, проверенный с Угловым 5.2.1)
-
npm install replace-in-file --save-dev
- Включите этот скрипт в свое приложение, например, в
build/fix-sw.js
- В вашем
package.json
:
"scripts": {
...
"sw-build": "ng build --prod && node build/fix-sw",
"sw-build-live": ng build --prod --base-href https://your-url.com/ && node build/fix-sw"
...
}
- Запуск локально
npm run sw-build cd dist http-server -p 8080
- И чтобы подготовить сборку для вашего живого URL-адреса, перед отправкой на сервер (например, с помощью угловых-cli-ghpages)
npm run sw-build-live