Я пытаюсь понять, как правильно обрабатывать кэш веб-браузера для одностраничных приложений.
У меня довольно типичный дизайн: несколько файлов HTML, JS и CSS, реализующих SPA, и куча данных JSON, которые используются SPA. Проблемы возникают, когда я хочу отправить обновление: я обновляю статическую часть сайта и код, который генерирует JSON одновременно, но клиентские браузеры часто кэшируют статическую часть, поэтому старый код пытается обработать новые данные и может (в зависимости от внесенных изменений) столкнуться с проблемами. (В частности, IE выглядит более агрессивно, чем Chrome или Firefox, в отношении использования кэшированного JS без повторной проверки.)
Какой лучший способ справиться с этим?
- Убедитесь, что мои изменения JSON обратно совместимы, и предположите, что срок действия кэшей браузера истечет в разумные сроки.
- Вставьте какой-то номер версии в статический JS и JSON, а затем выполните,
window.location.reload(true);
если они не совпадают. - Определите подходящую комбинацию заголовков (
must-revalidate
илиno-cache
что-то еще; источники различаются в зависимости от того, как это сделать), чтобы гарантировать, что браузеры всегда повторно проверяют все ресурсы при каждой загрузке, даже если это означает несколько дополнительных циклов для загрузки сайта. - Микро-управление моим контролем кэша и заголовками истекает, так что срок действия статического контента истекает, когда я хочу отправить обновление.
- Что-то другое?
javascript
web-applications
caching
Джош Келли
источник
источник
Ответы:
Вам нужно решение для очистки кэша . Роль очистки кэша:
В проекте на основе Grunt обычно используют grunt-rev, чтобы гарантировать, что все файлы, которые должны быть обновлены, имеют уникальные имена в зависимости от их содержимого.
Если вы гарантируете, что ваши файлы JSON получат имена файлов с кэшированием и ссылки на них в вашем Javascript, клиенты всегда будут загружать файлы JSON, которых ожидает Javascript.
Преимущество именования файлов на основе хеш-функции заключается в том, что файлы, которые не изменились, получат те же имена файлов после очистки кэша, поэтому браузеры могут продолжать безопасно использовать кэшированное содержимое, когда оно не изменилось.
Очевидно, что это именно то, что вы хотите автоматизировать как часть рабочей сборки вашего проекта, поэтому вам не нужно отслеживать изменение имен файлов и ссылок вручную.
источник
Вы можете использовать
if-modified-since + last-modified
илиif-none-match + etag
заголовки вместе с правильнымcache-control
заголовком. (Могут быть ошибки браузера , но вы ничего не можете сделать в последних браузерах.)Если файлы статичны, то я предлагаю вам использовать
if-modified-since
, потому что это можно сделать автоматически с хорошо настроенным HTTP-сервером. Он должен отправить обратно 304, если файл не был изменен с момента последней загрузки.Я не думаю, что ваши № 1 и № 2 будут работать в долгосрочной перспективе. № 3 или № 4 могут работать. № 3 проще, но вы должны научиться решать эту проблему только один раз. Поэтому я бы попробовал №4 на вашем месте, но решение может зависеть от того, какие браузеры используют ваши клиенты ... Например, IE8 имеет проблемы с обновлением ajax-кэша и т. Д.
источник
Если вы можете включить Java Servlet Filter в ваш SPA, вот рабочее решение: CorrectBrowserCacheHandlerFilter.java
По сути, когда ваш браузер запрашивает статические файлы, сервер перенаправляет все запросы на один и тот же, но с параметром запроса хеша (
?v=azErT
например), который зависит от содержимого целевого статического файла.При этом браузер никогда не будет кешировать статические файлы, объявленные в вашем
index.html
примере (потому что всегда будут получать a302 Moved Temporarily
), но будет кешировать только те, которые имеют хеш-версию (200
за них ответит сервер ). Таким образом, кэш браузера будет эффективно использоваться для тех статических файлов с хэш-версией.Отказ от ответственности: я автор
CorrectBrowserCacheHandlerFilter.java
.источник