Проблемы с кешем браузера AngularJS

Доброе утро, у меня есть веб-приложение в производственном окружении. Пользователи используют его каждый день, когда я публикую обновление, и пользователь возвращается в веб-приложение, которое он просматривает в старой версии веб-приложения. Он должен обновить браузер, чтобы загрузить новую версию. Как я могу решить эту проблему? Я не могу сказать, что сотни пользователей обновляют страницу каждый раз, когда я публикую обновление (3-4 раза в неделю).

Ответы

Ответ 1

Простым решением было бы добавить строки запроса, представляющие временную метку или идентификатор сеанса для ваших файлов.

Например, в наших приложениях spring мы просто используем:

<script src="js/angular/lib/app.js?r=<%= session.getId()%>"></script>

Вы можете реализовать одно и то же решение в своей конкретной реализации на сервере.

Ответ 2

Классическая проблема с кешем. Если не указано иное (веб-сервером), браузер будет кэшировать активы на основе имени файлов. Поэтому, когда он видит тот же самый script/style/image с тем же именем, он будет 304 и будет обслуживать кешированную версию. Это можно сделать несколькими способами:

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

Добавить параметр строки запроса в имя файла, например my-angular-code.js?x=123, снова неэффективно.

Отпечаток ваших активов. Это подробно описано в документации Rails Asset Pipeline. Существует несколько способов достижения этого, есть задачи grunt и gulp задачи, также доступные для этого. По сути, это процесс изменения имени файла только при изменении содержимого, заставляя браузер считать его новым.

Ответ 3

Если вы используете HTML5, вы можете использовать кэш приложений. Он будет автоматически проверять наличие обновлений, и вы можете попросить пользователя обновить кеш.

Вот несколько полезных руководств по его использованию:

Руководство для начинающих по использованию кэша приложений

Использование кэша приложений

Позвольте взять это в автономном режиме (автономные веб-приложения)

Ответ 4

Первым шагом будет понять, что происходит на стороне сервера прямо сейчас. Понять и настроить Cache-Control и Etag. Хотя вы можете использовать параметры строки запроса, отпечаток пальца - лучший способ, поскольку прокси-серверу будет разрешено кэшировать файл.

Идея заключается в том, что вы устанавливаете свои документы, которые могут измениться (если у вас есть приложение Angular, это скорее всего только ваш index.html) до no-cache и агрессивно кэширует ресурсы, которые ссылаются на этот документ. Когда вы выпускаете новую сборку, все ресурсы переименовываются, а когда приходит запрос, все работает так, как ожидалось.

Я использую grunt-rev в моем приложении Angular. Отлично работает.

Ответ 5

Первый шаг - получить метку времени и передать метку времени в качестве параметра запроса в URL для расширений .html.

При загрузке html-контента каждый раз он будет отображаться с разными маршрутами, поскольку временная метка добавляется к URL-адресу.

Пример:

var date = new Date().getTime().toString();
app.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider){
}])
$stateProvider.state('app', {
    abstract: true,
    url: '/app',
    cache: false,
    templateUrl: 'views/app.html'**+'?t='+ date**
  })
.state('app.dashboard', {
    url: '/dashboard',
    cache: false,
    controller: 'DashboardCtrl as showCase',
    templateUrl: 'components/dashboard/dashboard.view.html'**+'?t=' + date** ,
  })

Ответ 6

В дополнение к ответу Andy Gaskell, я использую gulp вместо grunt и использую gulp -rev и gulp -usemin для сопоставления версий js и css. Файлы HTML должны быть настроены так, чтобы они не кэшировались!!! Эта последняя часть очень важна.