Сравнение IndexedDB с LocalStorage и SessionStorage
При разработке современных веб-приложений выбор правильного API для клиентского хранилища данных может существенно повлиять на производительность приложения и пользовательский опыт. В то время как LocalStorage и SessionStorage хорошо справляются с простыми данными, IndexedDB предлагает возможности, которые делают его незаменимым для офлайн-приложений и управления сложными данными. Давайте рассмотрим, как эти варианты браузерного хранилища JavaScript соотносятся друг с другом и когда использовать каждый из них.
Ключевые выводы
- LocalStorage и SessionStorage — это синхронные API, ограниченные 5-10 МБ строковых данных
- IndexedDB обеспечивает асинхронные, неблокирующие операции с практически неограниченным хранилищем
- IndexedDB поддерживает сложные типы данных, транзакции и индексацию для эффективных запросов
- Выбирайте хранилище на основе сложности данных: для простых строк используйте LocalStorage, для сложных объектов нужен IndexedDB
Понимание трёх API клиентского хранилища
LocalStorage: простое и постоянное хранилище
LocalStorage хранит пары ключ-значение в виде строк, которые сохраняются бессрочно до явной очистки. С типичной ёмкостью 5-10 МБ на источник, он идеален для пользовательских настроек, параметров темы или небольших конфигурационных данных.
localStorage.setItem('userTheme', 'dark');
const theme = localStorage.getItem('userTheme'); // Returns 'dark'
Синхронная природа LocalStorage означает, что каждая операция блокирует основной поток. Чтение или запись всего 1 МБ данных может заморозить ваш интерфейс на 100-200 миллисекунд на обычных устройствах.
SessionStorage: временное хранилище вкладки
SessionStorage работает идентично LocalStorage, но с одним важным отличием: данные удаляются при закрытии вкладки. Он сохраняет те же ограничения в 5-10 МБ и синхронный API, что делает его подходящим для временных данных форм или управления состоянием в рамках одной сессии.
sessionStorage.setItem('formDraft', JSON.stringify(formData));
Данные остаются изолированными для каждой вкладки — открытие той же страницы в новой вкладке создаёт отдельный экземпляр SessionStorage.
IndexedDB против LocalStorage и SessionStorage: ключевые различия
Ёмкость хранилища и типы данных
В то время как LocalStorage и SessionStorage ограничивают вас строками и 5-10 МБ пространства, IndexedDB обрабатывает практически неограниченное хранилище (часто 50% доступного дискового пространства) и хранит JavaScript-объекты напрямую:
// IndexedDB stores complex objects without serialization
const userData = {
id: 1,
profile: { name: 'Alice', avatar: blobData },
settings: { theme: 'dark', notifications: true },
lastSync: new Date()
};
// Note: Map objects cannot be directly stored in IndexedDB
Характеристики производительности
Наиболее критичное различие заключается в производительности. LocalStorage и SessionStorage используют синхронные операции, которые блокируют выполнение JavaScript:
- LocalStorage/SessionStorage: синхронные, блокируют основной поток
- IndexedDB: асинхронные, неблокирующие операции
Для больших наборов данных LocalStorage может заметно блокировать интерфейс из-за своей синхронной природы, в то время как операции IndexedDB выполняются асинхронно и поддерживают отзывчивость интерфейса.
Целостность данных и транзакции
IndexedDB обеспечивает транзакционные операции, гарантирующие согласованность данных. Если какая-либо часть транзакции завершается неудачей, все изменения автоматически откатываются — это критически важно для офлайн-приложений, поддерживающих целостность данных.
Discover how at OpenReplay.com.
Когда IndexedDB превосходит LocalStorage
Приложения, ориентированные на офлайн-режим
Рассмотрим приложение для заметок, работающее офлайн. С IndexedDB вы можете хранить тысячи документов с вложениями, эффективно искать их с помощью индексов и синхронизировать изменения при восстановлении соединения — что невозможно с ограничениями LocalStorage.
Управление большими наборами данных
Сайты электронной коммерции могут кэшировать целые каталоги товаров в IndexedDB. Приложения, такие как Linear, используют этот подход для локального хранения данных проектов, проверяя актуальность кэша перед выполнением серверных запросов, что значительно сокращает время загрузки.
Сложные структуры данных
IndexedDB нативно обрабатывает Blob, File и типизированные массивы. Приложение для редактирования фотографий может хранить изображения напрямую без кодирования base64 (которое увеличивает размер на 33% в LocalStorage).
Сравнение практической реализации
Вот реальный пример хранения пользовательских данных:
// LocalStorage - requires serialization, blocks UI
const saveToLocalStorage = (data) => {
localStorage.setItem('userData', JSON.stringify(data)); // Blocks thread
};
// IndexedDB - handles objects, non-blocking (using idb library)
const saveToIndexedDB = async (data) => {
const db = await openDB('MyApp', 1, {
upgrade(db) {
db.createObjectStore('users', { keyPath: 'id' });
}
});
const tx = db.transaction('users', 'readwrite');
await tx.objectStore('users').put(data); // Non-blocking
};
Совместимость с браузерами и ограничения
Все три API имеют универсальную поддержку браузеров по состоянию на 2025 год. Однако поведение различается в режиме приватного просмотра:
- Safari: применяет более низкие квоты в приватном режиме по сравнению с обычным просмотром
- Firefox: очищает всё хранилище при завершении приватной сессии
- Chrome: сохраняет стандартные квоты в режиме инкогнито
Политики вытеснения хранилища также различаются. Браузеры могут очищать хранилище при нехватке дискового пространства, при этом данные IndexedDB, помеченные как «постоянные», получают защиту от автоматического удаления.
Правильный выбор
Выбирайте LocalStorage для:
- Пользовательских настроек размером менее 1 МБ
- Простых строковых данных
- Быстрых прототипов
Выбирайте SessionStorage для:
- Черновиков форм
- Временного состояния интерфейса
- Рабочих процессов в одной вкладке
Выбирайте IndexedDB для:
- Офлайн-функциональности
- Данных объёмом более 5 МБ
- Сложных объектов и файлов
- Требований к поиску и фильтрации
- Потребностей в целостности транзакций
Заключение
Хотя LocalStorage и SessionStorage остаются ценными для простых задач хранения, IndexedDB необходим для создания производительных веб-приложений, способных работать офлайн. Его асинхронная природа, неограниченная ёмкость и поддержка транзакций делают его единственным жизнеспособным выбором для хранения больших наборов данных или сложных структур данных. Для современных потребностей браузерного хранилища JavaScript, выходящих за рамки базовых пар ключ-значение, IndexedDB является рекомендуемым выбором для сложного или крупномасштабного клиентского хранилища.
Часто задаваемые вопросы
Нет, IndexedDB не может хранить объекты Map и Set напрямую. Вам нужно преобразовать их в обычные объекты или массивы перед сохранением. Используйте Array.from() для Set и Object.fromEntries() для Map, затем восстанавливайте их при извлечении данных.
Очистка кэша браузера обычно не влияет на данные IndexedDB. Пользователи должны специально очистить данные сайта или cookies, чтобы удалить содержимое IndexedDB. Однако браузеры могут вытеснить данные IndexedDB при нехватке места для хранения, если они не помечены как постоянные с помощью Storage API.
Для крошечных данных размером менее 100 КБ LocalStorage может быть быстрее для простого чтения благодаря своей синхронной природе. Однако неблокирующие операции IndexedDB предотвращают зависание интерфейса, что делает его лучшим для пользовательского опыта даже с небольшими наборами данных в продакшн-приложениях.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.