Middle+
25
Как работает кэширование ресурсов в браузере — как браузер понимает, брать из кэша или грузить заново, как этим управлять? Какие есть способы кэширования, включая Service Worker?
Сұралған компаниялар
Mayflower
AI-дан жауап
sobes.tech AI
Браузер кэширует ресурсы (HTML, CSS, JS, изображения и др.) для ускорения загрузки и снижения нагрузки на сеть. При повторном запросе браузер решает, использовать ли кэш или загрузить ресурс заново, основываясь на HTTP-заголовках и политике кэширования.
Как браузер решает брать из кэша или нет
- Cache-Control — основной заголовок, который задаёт правила кэширования. Например,
max-age=3600означает, что ресурс считается свежим в течение часа. - Expires — устаревший, но всё ещё поддерживаемый заголовок с датой истечения срока годности ресурса.
- ETag — уникальный идентификатор версии ресурса. При повторном запросе браузер отправляет
If-None-Matchс ETag, сервер отвечает 304 Not Modified, если ресурс не изменился. - Last-Modified — дата последнего изменения ресурса. Аналогично ETag, браузер отправляет
If-Modified-Since.
Если ресурс свежий и не истёк, браузер берёт его из кэша. Если нет — делает запрос на сервер с условием, чтобы проверить изменения.
Управление кэшированием
- Настраивать заголовки на сервере (например, в nginx, Apache, или backend-приложении).
- Использовать версионирование ресурсов (например, хеш в имени файла) для контроля обновлений.
- В HTML можно использовать
<meta http-equiv="Cache-Control" content="no-cache">, но это менее эффективно.
Способы кэширования
- HTTP-кэширование — стандартное кэширование через заголовки.
- LocalStorage / IndexedDB — для хранения данных на стороне клиента, не для ресурсов.
- Service Worker — скрипт, который работает между сетью и приложением, позволяет полностью контролировать кэширование, создавать офлайн-приложения.
Пример Service Worker для кэширования ресурсов:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/styles.css',
'/script.js',
'/image.png'
]);
})
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request);
})
);
});
Таким образом, Service Worker позволяет перехватывать запросы и отдавать ресурсы из кэша, даже если сеть недоступна.