Как определить устаревание кэша и сравнить версии ресурса
Что проверяют
Знаете ли вы, как браузер и сервер договариваются об актуальности ресурса, и умеете ли проверить это инструментами, а не на глаз. Следом обычно спрашивают, почему после деплоя пользователи видят старую версию и как вы это воспроизведёте.
Как отвечать
Разделите вопрос на две части: когда копия считается устаревшей и как проверить, что версия изменилась.
Свежесть задаёт заголовок Cache-Control:
max-age=3600: час ресурс берётся из кэша без обращения к серверу. ЗаголовокAgeв ответе CDN показывает, сколько секунд копия уже хранится;no-cache: хранить можно, но перед каждым использованием нужно сверяться с сервером;no-store: не сохранять вообще, это для личных данных;immutableвместе с хэшем в имени файла (app.3f9a1c.js): статика не перепроверяется, а новая версия получает новое имя.
Сравнение версий, то есть ревалидация:
ETag: сервер отдаёт метку версии, браузер присылает её вIf-None-Match. Если ничего не изменилось, приходит304 Not Modifiedбез тела, если изменилось,200с новым содержимым;Last-ModifiedиIf-Modified-Since: то же по дате, но с точностью до секунды, так что два обновления за одну секунду не различить.
Как проверять: вкладка Network в DevTools (колонка Size покажет (memory cache), (disk cache) или реальный размер, статус 304 виден отдельно), curl -I для заголовков и curl -H 'If-None-Match: "abc"' для ручной ревалидации. Для серверного кэша в Redis команда TTL key показывает оставшийся срок. Хороший кейс: изменить ресурс и убедиться, что после истечения max-age или сброса кэша приходит новая версия с новым ETag, а старую больше не отдают ни браузер, ни CDN.
Где спотыкаются
Считают, что no-cache запрещает кэширование. Запрещает no-store, а no-cache требует проверки перед использованием.
Тестируют с включённой галочкой «Disable cache» в DevTools или жёсткой перезагрузкой и делают выводы о поведении обычного пользователя.
Забывают про промежуточные слои: CDN, обратный прокси и Service Worker держат свои копии, и очистка одного из них не значит, что пользователь получил новую версию.