Fresh — это концепция, связанная с управлением кешированием HTTP-запросов и контролем актуальности данных на стороне клиента и сервера. В контексте веб-разработки термин часто используется при работе с сервисами, CDN, браузерным кешем и промежуточными прокси, чтобы определить, когда данные считаются «свежими» и могут быть использованы без повторного запроса к серверу. Основная цель — уменьшение лишних запросов и ускорение отклика приложения, сохраняя при этом корректность данных.
Контроль свежести данных осуществляется через набор стандартных HTTP-заголовков:
Cache-Control Этот заголовок задаёт политику кеширования. Ключевые директивы:
max-age=<seconds> — определяет, сколько секунд
данные считаются свежими.no-cache — запрещает использование закешированных
данных без проверки на сервере.no-store — полностью запрещает кеширование.public / private — определяет, может ли
кешироваться ответ в общем кеше (CDN, прокси) или только на
клиенте.Expires Указывает дату и время, после которых
ресурс считается устаревшим. Используется реже, так как
Cache-Control является более современным
инструментом.
ETag Уникальный идентификатор версии ресурса.
Сервер генерирует ETag на основе содержимого. Браузер при повторном
запросе отправляет заголовок If-None-Match с этим
значением. Если ресурс не изменился, сервер возвращает статус 304 (Not
Modified), что экономит трафик.
Last-Modified Показывает дату последнего
изменения ресурса. Клиент может использовать заголовок
If-Modified-Since для проверки актуальности
данных.
Свежесть данных определяется на основе трёх факторов:
Время жизни кеша Если ресурс не превышает
max-age или дату Expires, он считается свежим
и может быть использован без обращения к серверу.
Сравнение с сервером Если ресурс устарел,
браузер отправляет условный запрос с ETag или
Last-Modified. Сервер проверяет актуальность данных и, при
необходимости, возвращает новый ресурс.
Политика обновления Директивы
no-cache и must-revalidate заставляют клиент
проверять ресурс на сервере даже при наличии кеша.
В контексте фронтенда контроль свежести данных тесно связан с fetch API и сервис-воркерами:
Request:fetch('/api/data', { cache: 'no-cache' })
.then(response => response.json())
.then(data => console.log(data));
Доступные значения свойства cache:
default — стандартное поведение кеша.
no-store — не использовать кеш.
reload — игнорировать кеш и всегда загружать с
сервера.
no-cache — использовать кеш только после проверки с
сервером.
force-cache — использовать кеш без проверки
свежести.
only-if-cached — вернуть ресурс только из кеша,
иначе ошибка.
Сервис-воркеры Сервис-воркеры позволяют
полностью контролировать кеширование ресурсов на клиенте. Использование
Cache API позволяет создавать собственные правила Fresh для
различных типов данных:
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(cachedResponse => {
if (cachedResponse) {
return cachedResponse; // ресурс считается свежим
}
return fetch(event.request).then(networkResponse => {
return caches.open('dynamic-cache').then(cache => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
});
})
);
});
Оптимизация производительности Использование свежих данных из кеша снижает задержку загрузки страниц и уменьшает нагрузку на сервер.
Снижение трафика Условные запросы и кеширование экономят пропускную способность и ускоряют работу приложений на мобильных сетях.
Контроль актуальности Правильная настройка Fresh предотвращает использование устаревших данных, что критично для финансовых, новостных и интерактивных приложений.
no-cache
или must-revalidate.CSS, JS,
изображения) можно устанавливать длительный max-age и
уникальные ETag для версионирования.ETag и Cache-Control: max-age
позволяет получить баланс между производительностью и
актуальностью.Контроль Fresh является фундаментальной частью жизненного цикла запроса, обеспечивая эффективное использование кеша, снижение задержек и сохранение актуальности данных. В современных приложениях грамотное управление Fresh повышает производительность, снижает нагрузку на сервер и улучшает пользовательский опыт.