Обнаружение изменения версии приложения в одностраничном приложении

StackOverflow https://stackoverflow.com//questions/23056808

Вопрос

сегодня здесь был поднят вопрос, и у меня нет однозначного ответа.

Предположим, что мы объединяем и минимизируем все файлы ресурсов (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 . Создайте услугу, содержащую всю необходимую информацию (версии файлов с сервера) и методы для выполнения запроса сервера на свой сервер, чтобы проверить на текущих версиях файлов, хранящихся в сервисе.

3 . Используйте $ RouteChangescess событие для выполнения запроса сервера с использованием созданного вами службы На шаге 2 , если запрос вернул действительное подтверждение, что произошли изменения, затем выполняют перезагрузку страницы силы через window.location.reload().

Я решил добавить свои последние мысли, как здесь ответ:

Мы пошли на уменьшенное решение сейчас.

Как у нас есть «прокси-сервис», который (снова на данный момент) является единственным, который взаимодействует с этим приложением, мы добавили версию приложений на заголовок HTTP всех ответов.Если мы получим более новую версию, всплывающее окно появляется уведомление пользователя, а обновление полной страницы выдается ...

Это решение не будет работать для приложений, у которых нет собственной «частной» услуги.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top