← Назад к вопросам

Что нужно сделать чтобы закэшировать данные?

1.0 Junior🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегии кэширования данных во фронтенд-разработке

Кэширование данных на стороне клиента — критически важная техника для создания производительных и отзывчивых веб-приложений. Вот комплексный подход к реализации кэширования:

Основные механизмы кэширования

1. HTTP-кэширование через заголовки Самый фундаментальный уровень — использование заголовков HTTP для контроля кэширования браузером:

// Пример заголовков от сервера
// В Express.js или аналогичных фреймворках:
app.get('/api/data', (req, res) => {
  res.set({
    'Cache-Control': 'public, max-age=3600', // Кэшировать на 1 час
    'ETag': 'unique-resource-identifier',
    'Last-Modified': 'Mon, 15 Jan 2024 12:00:00 GMT'
  });
  res.json(data);
});

2. localStorage и sessionStorage Для простого хранения строковых данных:

// localStorage (сохраняется навсегда)
const cacheData = (key, data, ttl = 3600000) => {
  const item = {
    data,
    expiry: Date.now() + ttl
  };
  localStorage.setItem(key, JSON.stringify(item));
};

const getCachedData = (key) => {
  const itemStr = localStorage.getItem(key);
  if (!itemStr) return null;
  
  const item = JSON.parse(itemStr);
  if (Date.now() > item.expiry) {
    localStorage.removeItem(key);
    return null;
  }
  return item.data;
};

3. IndexedDB для сложных структур Для больших объемов структурированных данных:

// Пример работы с IndexedDB через библиотеку idb
import { openDB } from 'idb';

const initCacheDB = async () => {
  return openDB('app-cache', 1, {
    upgrade(db) {
      db.createObjectStore('responses', { keyPath: 'url' });
      db.createObjectStore('assets', { keyPath: 'name' });
    }
  });
};

const cacheApiResponse = async (url, data) => {
  const db = await initCacheDB();
  await db.put('responses', {
    url,
    data,
    timestamp: Date.now(),
    ttl: 3600000
  });
};

Продвинутые стратегии

4. Service Workers и Cache API Для кэширования сетевых запросов и ресурсов:

// service-worker.js
const CACHE_NAME = 'app-v1';

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        // Возвращаем из кэша если есть
        if (response) return response;
        
        // Иначе делаем сетевой запрос
        return fetch(event.request)
          .then(response => {
            // Кэшируем для будущих запросов
            if (event.request.method === 'GET') {
              caches.open(CACHE_NAME)
                .then(cache => cache.put(event.request, response.clone()));
            }
            return response;
          });
      })
  );
});

5. In-memory кэширование Для временного хранения в памяти приложения:

class MemoryCache {
  constructor() {
    this.cache = new Map();
    this.defaultTTL = 300000; // 5 минут
  }

  set(key, value, ttl = this.defaultTTL) {
    this.cache.set(key, {
      value,
      expiry: Date.now() + ttl
    });
    
    // Автоматическая очистка просроченных записей
    setTimeout(() => {
      if (this.cache.has(key)) {
        const entry = this.cache.get(key);
        if (Date.now() > entry.expiry) {
          this.cache.delete(key);
        }
      }
    }, ttl);
  }

  get(key) {
    const entry = this.cache.get(key);
    if (!entry) return null;
    
    if (Date.now() > entry.expiry) {
      this.cache.delete(key);
      return null;
    }
    
    return entry.value;
  }
}

// Использование
const apiCache = new MemoryCache();

Оптимальные практики

  • Многоуровневая стратегия: Комбинируйте разные подходы — быстрый in-memory кэш для частых данных, localStorage для сессионных данных, HTTP-кэширование для статических ресурсов
  • Инвалидация кэша: Реализуйте clear механизмы для удаления устаревших данных
  • Размер кэша: Контролируйте объем хранимых данных, реализуйте LRU (Least Recently Used) алгоритмы
  • Синхронизация данных: При работе с офлайн-режимом используйте паттерны типа stale-while-revalidate
  • Безопасность: Никогда не кэшируйте чувствительные данные (токены, пароли) в доступных хранилищах

Для современных React/Vue-приложений рекомендую использовать специализированные библиотеки: React Query, SWR, Apollo Client (для GraphQL) или RTK Query с Redux Toolkit. Эти решения предоставляют встроенные механизмы кэширования, инвалидации, фонового обновления и синхронизации.

Что нужно сделать чтобы закэшировать данные? | PrepBro