Какие основные механизмы хранения данных на стороне клиента (в браузере)?

Ответ

Браузеры предоставляют несколько API для хранения данных на клиенте, различающихся по объему, времени жизни и структуре.

Основные механизмы:

Механизм Объем Время жизни Структура Назначение
Cookies ~4 КБ Задается вручную (expires/max-age) или сессия Строка (key=value) Хранение небольших данных для сервера (сессии, токены). Автоматически отправляются с HTTP-запросами.
Web Storage ~5-10 МБ
  • localStorage Постоянно (до явного удаления) Ключ-значение (строки) Постоянное хранение пользовательских настроек (тема, язык).
  • sessionStorage До закрытия вкладки Ключ-значение (строки) Временное хранение данных в рамках одной сессии/вкладки.
IndexedDB До 50% свободного места Постоянно NoSQL-хранилище (объекты) Хранение больших объемов структурированных данных (офлайн-кэш, файлы).
Cache API Зависит от квоты Постоянно Пары Request/Response Кэширование сетевых запросов и ресурсов для работы Offline и PWA.

Примеры использования:

1. Cookies (установка с сервера или клиента):

// Установка cookie (клиентская)
document.cookie = "sessionId=abc123; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/; Secure";
// Примечание: Работа с document.cookie неудобна, лучше использовать библиотеки.

2. Web Storage (простой API):

// localStorage
localStorage.setItem('userTheme', 'dark');
const theme = localStorage.getItem('userTheme'); // 'dark'
localStorage.removeItem('userTheme');

// sessionStorage (аналогичный API)
sessionStorage.setItem('formDraft', JSON.stringify({ field1: 'value' }));

3. IndexedDB (сложный API, используется с промисами):

// Открытие базы данных
const request = indexedDB.open('MyDatabase', 1);
request.onsuccess = (event) => {
    const db = event.target.result;
    // ... операции с объектными хранилищами (object stores)
};
// Используйте библиотеки (idb, Dexie.js) для упрощения работы.

Ключевое для тестирования: Проверяйте корректность сохранения/чтения, обработку квот, поведение в режиме инкогнито (где данные могут очищаться), и влияние на производительность.

Ответ 18+ 🔞

А, слушай, вот эта тема про хранилища в браузере — это же просто песня, блядь! Сидишь такой, думаешь: «Ну куда я тут сохраню свои кривые настройки?» А оказывается, вариантов — овердохуища! Но каждый, сука, со своими подводными камнями, как будто специально, чтобы нас, разработчиков, выбесить.

Смотри, вот тебе расклад по полочкам, но без этой скучной официальщины.

Основные игроки на поле:

Штука Сколько влезет Сколько проживёт Что внутри Зачем оно вообще?
Cookies ~4 КБ, как записочка Задаёшь сам или до закрытия браузера Просто строка ключ=значение Шпионить за пользователем, блядь! Шутка. Ну, для сессий, токенов. Главная фишка — летят на сервер с каждым запросом сами, как назойливые мухи.
Web Storage ~5-10 МБ, уже лучше
  • localStorage Пока вручную не удалишь или пользователь не почистит Ключ-значение, но только строки Хранить что-то постоянное: тему, язык, логин. Просто и тупо.
  • sessionStorage Пока вкладку не закроешь — потом пиздец, всё пропало Тоже ключ-значение, строки Временный склад для данных одной вкладки. Обновил страницу — ещё живёт. Закрыл — в рот меня чих-пых!
IndexedDB Дохуя! (50% от свободного места) Постоянно Настоящая NoSQL база, объекты Когда нужно запихнуть в браузер гигабайты всякого хлама: офлайн-кэш, файлы, результаты выборки. Мощно, но API — просто ёперный театр!
Cache API Зависит от квоты, но тоже немало Постоянно Пары «Запрос-Ответ» (Request/Response) Чтобы приложение работало офлайн, сука! Кэшируешь картинки, скрипты, HTML — и потом можешь хвастаться, что у тебя PWA.

А теперь, блядь, как этим пользоваться на практике:

1. Куки (Cookies) Старые добрые кукисы. API у них — просто пиздец какой древний и неудобный.

// Запихнуть куку (с клиента)
document.cookie = "auth_token=secret123; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/; Secure";
// Честно, работать с этим через `document.cookie` — это как гвозди микроскопом забивать.
// Бери библиотеку, не мучайся.

2. Веб-сторедж (Web Storage) Тут всё просто, как три копейки. Идеально для мелких настроек.

// localStorage — переживёт ядерную зиму
localStorage.setItem('ui_theme', 'dark');
const savedTheme = localStorage.getItem('ui_theme'); // 'dark'
// Удалить? Легко!
localStorage.removeItem('ui_theme');

// sessionStorage — живёт один таб, как бабочка-однодневка
sessionStorage.setItem('unsaved_form_data', JSON.stringify({ name: 'Вася', drunk: true }));

3. IndexedDB Вот тут начинается настоящая магия и боль одновременно. Нативный API — это просто вынос мозга.

// Попытка открыть базу
const openRequest = indexedDB.open('MyAwesomeDB', 1);
openRequest.onsuccess = (event) => {
    const db = event.target.result;
    // Ура, база открылась! Теперь можно начинать страдать...
    // Создавать хранилища, класть туда объекты, искать их...
};
// Совет от сердца: НИКОГДА не пиши на чистом IndexedDB API, если ты не мазохист.
// Бери обёртку — `idb` или `Dexie.js`. Сохранишь себе кучу нервных клеток, блядь.

На что орать при тестировании:

  • Работает ли вообще? Сохранил — перезагрузил — прочитал. Ожидаемое == полученное.
  • Квоты, сука! Что будет, если пытаться запихнуть 100 МБ в localStorage? Правильно — тебе выкинут ошибку. Обрабатывай её!
  • Режим инкогнито. Там, блядь, всё может просто испаряться после закрытия окна. Не рассчитывай на надёжность.
  • Производительность. Особенно с IndexedDB. Не делай тысячу мелких записей, если можно одной пачкой.

Вот и вся наука. Выбирай инструмент по задаче, а не потому что он модный. И да пребудет с тобой терпение, когда полезешь в дебри IndexedDB!