Обнаруживать изменение версии приложения на одностраничном приложении
сегодня вопрос был поднят здесь, и у меня нет очевидного ответа.
Предположим, что мы объединяем и минимизируем все файлы ресурсов (CSS и Javascript) и объявляем их в "Мастер-странице".
В многостраничном приложении, если файл CSS изменяется, он будет перезаряжаться при следующей загрузке полной страницы.
В одностраничном приложении пользователь может продолжать работать в течение нескольких дней и не перезаряжать основную страницу, на которой объявляются файлы CSS. Пользователь никогда не увидит изменения до тех пор, пока не будет выдан Ctrl-F5.
Я уверен, что кто-то уже подумал об этом и получил опыт поделиться:)
Для меня использование WebSockets не является вариантом. Во-первых, потому что он переполняется и во-вторых, потому что не все мои клиенты поддерживают эту технологию. Такая же причина относится ко всем спамам WebSockets... Я не буду ударять по моим серверам из-за этого.
Итак, какие-нибудь идеи кто-нибудь?:)
Кстати, мы используем AngularJS, если это может помочь для конкретного решения.
Спасибо!
Ответы
Ответ 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...