Подтвердить что ты не робот

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

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

Предположим, что мы объединяем и минимизируем все файлы ресурсов (CSS и Javascript) и объявляем их в "Мастер-странице".

В многостраничном приложении, если файл CSS изменяется, он будет перезаряжаться при следующей загрузке полной страницы.

В одностраничном приложении пользователь может продолжать работать в течение нескольких дней и не перезаряжать основную страницу, на которой объявляются файлы CSS. Пользователь никогда не увидит изменения до тех пор, пока не будет выдан Ctrl-F5.

Я уверен, что кто-то уже подумал об этом и получил опыт поделиться:)

Для меня использование WebSockets не является вариантом. Во-первых, потому что он переполняется и во-вторых, потому что не все мои клиенты поддерживают эту технологию. Такая же причина относится ко всем спамам WebSockets... Я не буду ударять по моим серверам из-за этого.

Итак, какие-нибудь идеи кто-нибудь?:)

Кстати, мы используем AngularJS, если это может помочь для конкретного решения.

Спасибо!

4b9b3361

Ответ 1

У меня проблема с этой проблемой. Мое решение, которое оценивается и не отвечает на ваши критерии:

Когда я упаковываю свое приложение-приложение и мое серверное приложение, я делюсь файлом конфигурации, содержащим текущую версию front-app.

Лицевая сторона: 75% моих маршрутов меняют неявно вызов Webservice (разрешение изменения маршрута). SO каждый раз, когда я вызываю свой сервер, я включаю пользовательский HTTP-заголовок (или параметр GET/POST), содержащий клиентскую версию front-app.

Серверная часть: я сравниваю версию front-app (ту, что в браузере пользователя, загружаемую в последний раз пользователем, обновляла/загружала SPA) с версией совместного доступа к файлу front-app:

  • Если версия соответствует: Я ничего не делаю.
  • Если версия не соответствует, я отправляю код ошибки пользовательского HTTP-кода (например, 418)

Затем передняя сторона: я добавил ответ Interceptor, который перехватывает любой код ошибки 418 и обновляет силовое приложение для всего приложения

Что это. В принципе, событие, которое "проверяет", если версия front-app является последней, - это изменение маршрута (которое вызывает WS через ajax). Но вы можете добавить бесконечный $timeout callind для выделенного WS каждые 5 минут или около того... При необходимости я могу добавить код.

Надеюсь, что это поможет;)

Ответ 2

Предполагая, что вы используете маршрутизацию AngularJS через $route service и provider, вы можете использовать событие $routeChangeSuccess для выполнения запроса сервера, если есть значительные изменения, которые необходимо изменить; если есть, то вы можете сделать window.location.reload(), чтобы обновить страницу и получить все обновленные ресурсы и htmls.

Следующий процесс может быть изменен в зависимости от того, как вы его реализуете:

1. Настройте файл конфигурации на своем сервере с указанием версии приложения. Вы также можете назначить разные версии для разных файлов, но поскольку вы объединили все свои файлы ресурсов, я думаю, вы можете ограничить свои варианты версий в своей конфигурации.

2. Создайте службу, которая содержит всю необходимую информацию (версии файлов с сервера) и методы для выполнения запроса сервера на ваш сервер, чтобы проверить текущие версии файлов, хранящиеся в службе.

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

Ответ 3

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

На данный момент мы решили сократить решение.

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

Это решение не будет работать для приложений, у которых нет службы "private".

Ответ 4

Назовите меня старомодным, но я просто позволю своему пользователю узнать, что в нем есть более прохладный, лучший и просто потрясающий обновленный пользовательский интерфейс, доступный с некоторым предупреждающим полем, и когда они предпринимают действия и нажимают на него - просто обновите страницу, Может быть, код не решит этого, но какая-то психология UX...