Хранилище, используемое через IndexedDB (и, как следствие, через библиотеку localForage), подчиняется системе квот, установленной браузером и операционной системой. Объём доступного пространства не является фиксированным и определяется динамически на основе нескольких факторов:
В отличие от традиционных серверных хранилищ, клиентское хранилище в браузере является разделяемым ограниченным ресурсом, и каждый origin получает лишь часть общего пула.
IndexedDB не задаёт жёсткого лимита на уровне спецификации. Ограничения вводятся реализациями браузеров:
Фактический лимит может изменяться во время работы приложения. Это означает, что операция записи, успешно выполнявшаяся ранее, может завершиться ошибкой при увеличении объёма данных или изменении состояния диска.
localForage, как абстракция над IndexedDB, WebSQL и localStorage, наследует эти ограничения напрямую.
При превышении лимита хранилища IndexedDB генерирует ошибку квоты. В контексте localForage это проявляется через отклонённый Promise с ошибкой, связанной с записью данных.
Типичные сценарии:
На уровне браузера может быть инициировано внутреннее сжатие или очистка неиспользуемых данных, но это не гарантируется.
Современные браузеры предоставляют механизм запроса увеличения квоты через Storage API.
Основной метод:
navigator.storage && navigator.storage.persist()
Этот вызов переводит хранилище в режим постоянного хранения (persistent storage), уменьшая вероятность автоматического удаления данных при нехватке места.
Также доступна проверка статуса:
navigator.storage && navigator.storage.persisted()
Возвращаемое значение отражает, было ли хранилище уже переведено в постоянный режим.
Если браузер предоставляет согласие на постоянное хранение:
Однако даже persistent storage не гарантирует абсолютную защиту: при критическом дефиците дискового пространства данные могут быть удалены системой.
Режим приватного просмотра существенно изменяет поведение квотирования:
localForage в таком режиме работает поверх временного IndexedDB, что делает долговременное хранение невозможным.
При работе с localForage важно учитывать специфические ошибки:
QuotaExceededError — превышение лимита;InvalidStateError — невозможность записи из-за
состояния базы;UnknownError — общая ошибка движка хранения.Такие ошибки возникают асинхронно и требуют обработки через
.catch() или try/catch при использовании
async/await.
try {
await localforage.setItem('key', largeData);
} catch (e) {
if (e.name === 'QuotaExceededError') {
// обработка нехватки места
}
}
При работе с ограниченными квотами применяется несколько практических подходов:
Перед записью данные сериализуются и сжимаются (например, gzip или lz-string). Это снижает нагрузку на IndexedDB, но увеличивает вычислительные затраты.
Большие структуры разбиваются на несколько ключей:
Реализуется политика TTL (time-to-live):
Хотя браузер не всегда предоставляет точные метрики, можно использовать:
navigator.storage && navigator.storage.estimate()
Этот метод возвращает приблизительный объём использования и доступного пространства.
navigator.storage.estimate() возвращает объект:
usage — фактически занятое пространство;quota — общий лимит для origin.Разница между ними позволяет оценить запас перед записью. Однако значения являются приблизительными и могут изменяться между вызовами.
localForage не абстрагирует этот уровень, поэтому подобные проверки выполняются вручную на уровне приложения.
IndexedDB способен хранить крупные бинарные данные (Blobs, ArrayBuffer), но производительность зависит от:
При увеличении объёма объектов растёт:
localForage минимизирует часть этих проблем, но не устраняет ограничения движка.
Каждый origin имеет собственную квоту, но браузер может перераспределять ресурсы:
Это означает, что поведение хранилища нельзя считать стабильным в долгосрочной перспективе.
При работе на границе квоты важно учитывать возможные сценарии:
localForage обеспечивает атомарность на уровне операций, но не гарантирует успешность записи при отсутствии ресурсов.
localForage может переключаться между IndexedDB, WebSQL и localStorage. При ограничениях:
При нехватке места fallback на localStorage часто приводит к ошибкам переполнения значительно быстрее, чем в IndexedDB.
Эффективная работа с ограничениями строится на комбинировании нескольких уровней:
estimate();Такой подход делает систему хранения устойчивой к изменяющимся ограничениям браузеров и операционной среды.