Обнаружение изменения версии приложения в одностраничном приложении
-
23-12-2019 - |
Вопрос
сегодня здесь был поднят вопрос, и у меня нет однозначного ответа.
Предположим, что мы объединяем и минимизируем все файлы ресурсов (CSS и Javascript) и объявляем их на "Главной странице".
В многостраничном приложении, если файл CSS изменится, он будет обновлен при следующей полной загрузке страницы.
В одностраничном приложении пользователь может продолжать работать в течение нескольких дней и никогда не заходить на главную страницу, где объявлены CSS-файлы.Пользователь никогда не увидит изменений, пока не будет нажата клавиша Ctrl-F5.
Я уверен, что кто-то уже думал об этом, и у него есть опыт, которым можно поделиться :)
Для меня использование WebSockets - это не вариант.Во-первых, потому, что это излишество, а во-вторых, потому, что не все мои клиенты поддерживают эту технологию.Та же причина применима ко всем резервным копиям WebSockets...Я не буду продолжать заходить на свои серверы из-за этого.
Итак, у кого-нибудь есть идеи?:)
Кстати, мы используем AngularJS, если это может помочь для конкретного решения.
Спасибо!
Решение
Я столкнулся с той же проблемой.Мое решение, которое является самоуверенным и может не соответствовать вашим критериям :
Когда я упаковываю свое фронт-приложение и свое серверное приложение, я предоставляю общий доступ к файлу конфигурации, содержащему текущую версию фронт-приложения.
Лицевая сторона :75% изменений моих маршрутов неявно вызывают веб-сервис (разрешение изменения маршрута).ПОЭТОМУ каждый раз, когда я вызываю свой сервер, я включаю пользовательский HTTP-заголовок (или параметр GET / POST), содержащий клиентскую версию фронт-приложения.
Серверная сторона :Я сравниваю версию фронтального приложения (ту, что в браузере пользователя, загруженную в последний раз, когда пользователь обновлял / загружал SPA) с версией фронтального приложения общего файла конфигурации :
- Если версия совпадает :Я ничего не делаю.
- Если версия не совпадает, я отправляю пользовательский код ошибки состояния HTTP (например, 418).
Затем лицевая сторона:Я добавил перехватчик ответов, который перехватывает любой код ошибки 418 и выполняет принудительное обновление всего приложения
Вот и все.По сути, событие, которое "проверяет", является ли версия front-app последней, - это изменение маршрута (которое вызывает WS через ajax).Но вы могли бы добавить некоторый бесконечный интервал $, вызывающий выделенный WS каждые 5 минут или около того...Я могу добавить немного кода, если это необходимо.
Надеюсь, это поможет ;)
Другие советы
Предполагая, что вы используете маршрутизацию Angularjs через $ Cressional Service и Provider, затем вы можете использовать событие $routeChangeSuccess
для выполнения запроса на сервер, если существуют значительные изменения, которые необходимо изменить; Если есть какие-либо, вы можете сделать окно .Location.reload (), чтобы обновить страницу и получить все обновленные ресурсы и HTMLS.
Следующий процесс может быть изменен в зависимости от того, как вы хотите реализовать его:
<Сильно> 1 . Установите файл конфигурации на вашем сервере, указывающий версию приложения. Вы также можете назначить разные версии для разных файлов, но поскольку у вас есть все ваши файлы ресурсов, то, я думаю, вы можете ограничить варианты вашей версии в вашей конфигурации.
<Сильные> 2 . Создайте услугу, содержащую всю необходимую информацию (версии файлов с сервера) и методы для выполнения запроса сервера на свой сервер, чтобы проверить на текущих версиях файлов, хранящихся в сервисе.
window.location.reload()
.
Я решил добавить свои последние мысли, как здесь ответ:
Мы пошли на уменьшенное решение сейчас.
Как у нас есть «прокси-сервис», который (снова на данный момент) является единственным, который взаимодействует с этим приложением, мы добавили версию приложений на заголовок HTTP всех ответов.Если мы получим более новую версию, всплывающее окно появляется уведомление пользователя, а обновление полной страницы выдается ...
Это решение не будет работать для приложений, у которых нет собственной «частной» услуги.