> Какие данные кэшируются и как работает кэширование (JavaScript)
Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы
Компании: QueenInteractiveGamesLtd
Стек: JavaScript, Node.js, Go
> Пример ответа
Кэширование во фронтенде - это сохранение часто запрашиваемых данных в быстром хранилище (память браузера, localStorage, Service Worker) для ускорения повторных запросов и снижения нагрузки на сервер.
Типы кэшируемых данных:
-
Статические ресурсы (HTML, CSS, JS, изображения) - кэшируются браузером по HTTP-заголовкам (
Cache-Control,ETag). Например,Cache-Control: max-age=3600кэширует файл на час. -
API-ответы - данные с сервера (списки товаров, профили пользователей). Кэшируются в памяти (Redux, React Query) или в
localStorageдля офлайн-доступа. -
Сессионные данные (токены, настройки) - хранятся в
sessionStorageилиcookiesдля быстрого доступа без повторной авторизации. -
Вычисления - результаты дорогих операций (например, сортировка больших массивов) кэшируются в переменных или через
useMemo/useCallback.
Как работает кэширование на практике:
-
HTTP-кэширование: Браузер проверяет заголовки ответа. Если ресурс свежий (по
max-age), берет из локального кэша. Если устарел, отправляет запрос сIf-None-Match— сервер возвращает304 Not Modified, и кэш обновляется. -
Service Worker: Перехватывает запросы, сначала ищет в кэше (Cache API), при отсутствии - загружает с сети и сохраняет. Позволяет работать офлайн.
-
In-memory кэш: Например, React Query хранит данные в памяти, автоматически инвалидируя их по таймеру или при мутации. Это уменьшает количество запросов к API.
-
localStorage/sessionStorage: Для долгоживущих данных (например, темы оформления) - записываем при получении, читаем при загрузке страницы.
Важные нюансы:
-
Инвалидация кэша - ключевая проблема. Используйте версионирование ресурсов (hash в имени файла) или явные ключи (например,
user_123_profile). -
Не кэшируйте чувствительные данные (пароли, токены) в localStorage без шифрования.
-
Для Node.js/Go на бэкенде кэширование часто реализуется через Redis или in-memory map с TTL (time-to-live), чтобы не дублировать логику на клиенте.
Пример простого кэша на JavaScript:
JAVASCRIPTconst cache = new Map();function fetchWithCache(url, ttl = 60000) {const cached = cache.get(url);if (cached && Date.now() - cached.timestamp < ttl) {return Promise.resolve(cached.data);}return fetch(url).then(res => res.json()).then(data => {cache.set(url, { data, timestamp: Date.now() });return data;});}
> Похожие задачи по JavaScript
Что такое транзакции в базах данных и каковы их основные свойства
Приходилось ли менять уровни изоляции транзакций?
Какие архитектурные подходы и паттерны использовались в проектах
В чем разница реляционных и нереляционных баз данных
> Похожие задачи по frontend
Что такое транзакции в базах данных и каковы их основные свойства
Приходилось ли менять уровни изоляции транзакций?
Какие архитектурные подходы и паттерны использовались в проектах
В чем разница реляционных и нереляционных баз данных
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью