IndexedDB не предоставляет фиксированного и заранее известного размера хранилища. Вместо этого используется модель квотирования (storage quota), в которой каждый источник (origin) получает динамически управляемый лимит. Этот лимит зависит от множества факторов: свободного дискового пространства, политики браузера, типа устройства и уровня активности пользователя.
Браузер рассматривает IndexedDB как часть общего хранилища origin, куда также входят:
localStoragesessionStorageВсе эти системы делят общий бюджет, поэтому фактический лимит IndexedDB всегда контекстный.
Точные значения не стандартизированы и могут изменяться, но наблюдаются типичные диапазоны:
Google Chrome / Chromium-браузеры
Firefox
Safari
Разброс значений делает невозможным проектирование системы хранения на основе фиксированного числа мегабайт.
Современные браузеры применяют динамическое управление квотой, при котором:
Приложение запрашивает запись данных
Браузер проверяет доступное пространство
При нехватке:
QuotaExceededErrorОсобенность IndexedDB заключается в том, что ошибка переполнения возникает не заранее, а в момент записи транзакции.
Ограничения обусловлены несколькими факторами:
Некоторые браузеры используют механизм eviction (вытеснение данных). Он активируется при критической нехватке места.
Типичный порядок удаления:
Важно, что IndexedDB может быть удалена полностью без запроса к пользователю, особенно на мобильных платформах.
Существуют механизмы повышения устойчивости данных.
navigator.storage.persist().then((granted) => {
console.log(granted);
});
Если разрешение получено, браузер старается:
Однако это не отменяет квоты полностью, а лишь повышает приоритет хранения.
При переполнении IndexedDB возможны следующие сценарии:
QuotaExceededError при записиБиблиотеки вроде localForage обычно не управляют квотами напрямую, а лишь пробрасывают ошибки выше уровня абстракции.
localForage использует IndexedDB как основной драйвер, поэтому наследует все ограничения:
При этом API localForage скрывает детали транзакций, из-за чего ошибка переполнения проявляется только на уровне промисов:
localforage.setItem('key', largeData)
.catch(err => {
console.error(err.name);
});
При ошибке переполнения обычно возвращается объект ошибки с именем
QuotaExceededError.
Мобильные браузеры вводят более строгие ограничения:
На десктопе IndexedDB ведёт себя более стабильно, но всё равно зависит от состояния диска.
IndexedDB использует внутренние структуры хранения, которые могут приводить к неэффективному использованию диска:
Это означает, что фактический объём данных на диске всегда больше логического объёма, видимого в приложении.
localForage использует сериализацию значений (обычно через structured clone алгоритм). Это влияет на итоговый размер:
Выбор формата данных напрямую влияет на вероятность достижения квоты.
Ключевая особенность IndexedDB — отсутствие фиксированного потолка, что приводит к следующим эффектам:
По этой причине любые численные ограничения в приложениях носят лишь оценочный характер.
При проектировании хранилищ на базе localForage обычно учитываются следующие принципы:
QuotaExceededError как штатного сценарияЭти меры компенсируют неопределённость объёма IndexedDB и позволяют поддерживать стабильную работу приложения даже при резких изменениях доступного пространства.