Angular Service Worker: обновление развертываемого приложения выдает ошибку 504
Я создаю свой проект angular 8, используя ng build --prod
Обслуживайте его из папки /dist с помощью http-сервера (и в конечном итоге остановите его, и приложение по-прежнему будет работать, обслуживаясь через сервис-воркер)
проект регистрирует своего сервис-воркера
Я могу перемещаться по маршрутам, которые я предварительно выбрал и загрузил из кусков
Обновляю маршруты, работает как положено.
Однако когда я делаю то же самое с решением, которое было развернуто на сервере ( IIS), оно выдает ошибку 504, т.е. эта страница не работает ______ потребовалось слишком много времени, чтобы ответить. ОШИБКА HTTP 504
** - хотя базовый маршрут работает (даже при обновлении), но дочерний маршрут не работает (может перемещаться, но при перезагрузке выдает 504), а на вкладке сетей я вижу статус сбоя **
Кроме того, базовый href для нашего приложения настраивается в зависимости от различных сред, которые мы используем. Несмотря на то, что мы упоминаем область как текущий базовый href, а начальный URL как '/index.html' OR './' OR '/', проблема, похоже, сохраняется.
Это поведение IIS, или файл manifest.json кажется виноватым, или что-то еще, что мне нужно настроить для работы в этой настройке?
1 ответ
У меня была такая же проблема некоторое время назад , и я смог решить ее для меня. С тех пор он работает нормально, поэтому я решил поделиться им и здесь. Вот мой ответ на мой пост:
Так что, видимо , моя проблема не имеет ничего общего с моей конфигурацией IIS. Я до сих пор не могу объяснить, почему он работал на http-сервере, но теперь он работает и на IIS.
После долгих исследований и безуспешных экспериментов я попытался пронаблюдать, что именно делает ngsw-worker.js, что приводит к этой ошибке. Поставив несколько точек останова и найдя новые ключевые слова для поиска, я наткнулся на эту проблему GitHub , которая привела меня к этой широко обсуждаемой проблеме . В одном из своих комментариев пользователь jackkoppa упомянул свой вопрос StackOverflow , в котором он нашел обходной путь для решения такой проблемы.
По сути, я просто добавил его скрипт в наш проект и добавил команду для него в наш project.json.
Вот шаги, которые он описывает:
Чтобы использовать обходной путь: (Angular 5, протестировано с Angular 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-адреса, перед отправкой на сервер (например, с помощью angular-cli-ghpages) запустите npm .
sw-build-live
После добавления скрипта мое приложение Angular, наконец, ведет себя так, как задумано.
В нашем случае мы не используем base-href, поэтому все, что он делает для нас, это комментирует каждый раз, когда сервис-воркер пишет
EXISTING_CLIENTS_ONLY
своему состоянию.