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

Какие знаешь Storage?

2.0 Middle🔥 141 комментариев
#Soft Skills и рабочие процессы

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

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

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

Механизмы хранения данных (Storage) в браузере

В современной веб-разработке существует несколько ключевых механизмов хранения данных на стороне клиента, каждый из которых имеет свои особенности, преимущества и ограничения. Вот основные типы storage, которые я использую в своей практике:

1. LocalStorage

LocalStorage — это часть Web Storage API, которая предоставляет простое key-value хранилище без срока действия. Данные сохраняются даже после закрытия браузера.

// Работа с LocalStorage
// Запись данных
localStorage.setItem('username', 'JohnDoe');
localStorage.setItem('settings', JSON.stringify({ theme: 'dark' }));

// Чтение данных
const username = localStorage.getItem('username');
const settings = JSON.parse(localStorage.getItem('settings'));

// Удаление данных
localStorage.removeItem('username');
localStorage.clear(); // Очистка всего хранилища

Характеристики:

  • Объем: обычно 5-10 MB в зависимости от браузера
  • Синхронный API (может блокировать основной поток при больших объемах)
  • Доступен только в том же origin (протокол+домен+порт)
  • Данные хранятся в виде строк

2. SessionStorage

SessionStorage — аналогичен LocalStorage, но данные очищаются при закрытии вкладки/сессии браузера.

// SessionStorage имеет тот же API
sessionStorage.setItem('tempData', 'Временные данные');
const temp = sessionStorage.getItem('tempData');

Ключевые отличия от LocalStorage:

  • Данные живут только в рамках одной сессии браузера
  • Изолированы между вкладками (каждая вкладка имеет свою sessionStorage)

3. Cookies

Cookies — традиционный механизм хранения небольших объемов данных, который автоматически отправляется на сервер с каждым HTTP-запросом.

// Установка cookie
document.cookie = "username=John; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/";

// Чтение всех cookies
const allCookies = document.cookie;

// Более удобная работа через библиотеки или собственные утилиты
function setCookie(name, value, days) {
    const expires = new Date(Date.now() + days * 864e5).toUTCString();
    document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=/';
}

Особенности cookies:

  • Ограничение размера: ~4KB на cookie
  • Автоматическая отправка на сервер
  • Можно установить срок жизни, домен, путь
  • Подвержены CSRF-атакам (нужны дополнительные меры безопасности)

4. IndexedDB

IndexedDB — полноценная NoSQL база данных в браузере для хранения больших объемов структурированных данных.

// Пример работы с IndexedDB
const request = indexedDB.open('myDatabase', 1);

request.onupgradeneeded = function(event) {
    const db = event.target.result;
    const store = db.createObjectStore('users', { keyPath: 'id' });
    store.createIndex('email', 'email', { unique: true });
};

request.onsuccess = function(event) {
    const db = event.target.result;
    const transaction = db.transaction('users', 'readwrite');
    const store = transaction.objectStore('users');
    
    store.add({ id: 1, name: 'John', email: 'john@example.com' });
};

Преимущества IndexedDB:

  • Асинхронный API (не блокирует основной поток)
  • Поддержка транзакций и индексов
  • Хранение сложных структур данных (объекты, файлы)
  • Большой лимит хранения (обычно 50% свободного места на диске)

5. Cache API (Service Workers)

Cache API предназначен для кэширования сетевых запросов и используется преимущественно в Service Workers для создания Progressive Web Apps.

// Пример использования Cache API в Service Worker
self.addEventListener('fetch', function(event) {
    event.respondWith(
        caches.match(event.request)
            .then(function(response) {
                // Возвращаем закэшированный ресурс или делаем сетевой запрос
                return response || fetch(event.request);
            })
    );
});

6. Web SQL (устаревший)

Web SQL был попыткой внедрить SQLite в браузер, но сейчас считается устаревшим и не рекомендуется к использованию.

Сравнение и выбор Storage

При выборе механизма хранения я руководствуюсь следующими критериями:

Когда использовать LocalStorage/SessionStorage:

  • Небольшие объемы данных (до 5MB)
  • Простые строковые данные
  • Быстрый доступ к настройкам пользователя
  • Данные, не требующие сложных запросов

Когда выбирать Cookies:

  • Необходимость автоматической отправки данных на сервер
  • Хранение сессионных токенов
  • Небольшие объемы данных (до 4KB)
  • Кроссплатформенная совместимость

Когда переходить на IndexedDB:

  • Большие объемы данных (сотни MB)
  • Сложные структуры данных
  • Необходимость в индексации и сложных запросах
  • Оффлайн-функциональность приложения

Важные практические аспекты

  1. Безопасность: Никогда не храните чувствительные данные (пароли, токены) в LocalStorage из-за риска XSS-атак.

  2. Сериализация: LocalStorage хранит только строки, поэтому для объектов используйте JSON.stringify/parse.

  3. Квота хранения: Современные браузеры предоставляют динамическую квоту, основанную на свободном месте на устройстве.

  4. Обработка ошибок: Всегда обрабатывайте возможные ошибки при работе с storage:

try {
    localStorage.setItem('key', 'value');
} catch (e) {
    if (e.name === 'QuotaExceededError') {
        console.error('Хранилище переполнено');
        // Логика очистки старых данных
    }
}
  1. События изменений: Можно отслеживать изменения в LocalStorage:
window.addEventListener('storage', function(event) {
    console.log('Изменен ключ:', event.key);
    console.log('Старое значение:', event.oldValue);
    console.log('Новое значение:', event.newValue);
});

На практике я часто комбинирую разные типы storage: LocalStorage для настроек UI, Cookies для аутентификации, IndexedDB для оффлайн-данных приложения. Ключевой принцип — выбирать инструмент, максимально соответствующий конкретной задаче по объему данных, структуре и требованиям к производительности.

Какие знаешь Storage? | PrepBro