В контексте веб-разработки на JavaScript термин Fresh часто используется в сочетании с механизмом кеширования и контроля актуальности данных HTTP-ответа. Основная идея заключается в определении того, является ли полученный ресурс свежим (fresh) или устаревшим (stale). Проверка свежести позволяет минимизировать лишние сетевые запросы, экономить ресурсы сервера и ускорять работу клиента.
Механизм Fresh тесно связан с заголовками HTTP, такими как
Cache-Control, ETag и
Last-Modified. Эти заголовки предоставляют информацию,
необходимую для определения актуальности ресурса без полной загрузки
данных.
Cache-Control Устанавливает правила кеширования. Ключевые директивы:
max-age=<seconds> — ресурс считается свежим в
течение указанного времени.no-cache — ресурс всегда проверяется перед
использованием.public / private — указывает, может ли
кешироваться публично или только индивидуально.ETag Уникальный идентификатор версии ресурса.
Сервер генерирует его при каждом изменении данных. Клиент отправляет
этот идентификатор в заголовке If-None-Match, чтобы
проверить актуальность ресурса.
Last-Modified Дата последнего изменения ресурса.
Клиент может использовать заголовок If-Modified-Since для
проверки, обновился ли ресурс с момента последнего запроса.
В JavaScript проверка свежести часто реализуется через Response helpers — утилиты, которые упрощают работу с HTTP-ответами и кешем. Основные моменты:
response.ok Возвращает
true, если статус ответа в диапазоне 200–299. Хотя это не
напрямую связано с кешем, часто является первым фильтром перед
обработкой данных.
response.headers.get() Позволяет
получить заголовки ETag, Last-Modified и
Cache-Control. Эти значения необходимы для определения
свежести ресурса.
response.clone() Создает копию
ответа, чтобы его можно было повторно использовать, например, для
кеширования. Особенно важно при работе с потоками
(Response.body).
async function fetchResource(url) {
const response = await fetch(url, { cache: 'no-cache' });
const etag = response.headers.get('ETag');
const lastModified = response.headers.get('Last-Modified');
if (response.ok) {
const data = await response.json();
return { data, etag, lastModified };
} else {
throw new Error(`Ошибка загрузки: ${response.status}`);
}
}
В примере происходит явное отключение встроенного кеша браузера
(cache: 'no-cache') с последующей проверкой актуальности
через заголовки. Полученные значения можно использовать для условного
запроса только при устаревании данных.
Для серверной части часто создаются функции-обертки над стандартными ответами, чтобы автоматизировать проверку свежести и отправку соответствующих статусов.
Пример с Express:
app.get('/api/data', (req, res) => {
const data = getDataFromDatabase();
const etag = generateETag(data);
if (req.headers['if-none-match'] === etag) {
res.status(304).end(); // Ресурс свежий
} else {
res.setHeader('ETag', etag);
res.json(data); // Ресурс устарел, отправляем новые данные
}
});
В этом случае Response helper упрощает работу с ETag, позволяя серверу сообщать клиенту о свежести данных без пересылки полного тела ответа.
ETag и Last-Modified для
идентификации актуальности ресурса.Cache-Control, учитывая специфику
приложения.304 Not Modified, чтобы не
отправлять лишние данные.Эти подходы образуют фундамент современной работы с кешем и Fresh в JavaScript как на клиенте, так и на сервере.