Современные браузеры управляют дисковым пространством по модели квот и автоматической очистки. Данные веб-приложений могут быть удалены системой при нехватке места, при очистке кэша или в условиях давления на хранилище. Для приложений, использующих офлайн-режим, кеширование и локальные базы данных через IndexedDB, это поведение становится критическим фактором устойчивости.
В контексте работы с localForage, который абстрагирует IndexedDB, WebSQL и localStorage, особенно важно понимать механизм постоянного (persistent) хранилища, предоставляемый Storage API. Он позволяет запросить у браузера исключение для данных приложения из политики автоматического удаления.
Браузерное хранилище делится на несколько категорий:
localForage в большинстве режимов использует IndexedDB, а значит попадает под правила квоты браузера. При отсутствии постоянного статуса данные могут быть удалены без участия приложения.
Storage API предоставляет интерфейс navigator.storage,
через который можно управлять характеристиками хранения.
Ключевой метод:
navigator.storage.persist()
Он запрашивает у браузера разрешение на перевод хранилища в режим persistent.
Результат — булево значение:
true — доступ к постоянному хранилищу
предоставлен;false — запрос отклонён системой или политикой
браузера.Перед запросом можно проверить, имеет ли приложение уже постоянный статус:
const isPersisted = await navigator.storage.persisted();
Возвращаемое значение:
true — данные уже защищены от автоматического
удаления;false — хранилище временное и может быть очищено
системой.Стандартный сценарий включает проверку текущего статуса и последующий запрос:
async function ensurePersistentStorage() {
if (!navigator.storage || !navigator.storage.persist) {
return false;
}
const alreadyPersisted = await navigator.storage.persisted();
if (alreadyPersisted) {
return true;
}
const granted = await navigator.storage.persist();
return granted;
}
Этот вызов инициирует взаимодействие с политикой браузера. Решение о выдаче статуса зависит от факторов:
Разные браузеры используют собственные алгоритмы оценки “доверенности” источника:
Факторы, повышающие вероятность получения persistent storage:
localForage сам по себе не управляет политикой хранения, но напрямую зависит от IndexedDB. При нехватке места браузер может удалить:
После потери данных localForage возвращает пустые значения или отсутствующие ключи, что может приводить к деградации состояния приложения.
Запрос persistent storage снижает вероятность такого сценария.
import localforage from "localforage";
async function initStorage() {
const persisted = await navigator.storage?.persisted?.();
if (!persisted) {
await navigator.storage?.persist?.();
}
await localforage.config({
name: "app_database",
storeName: "cache_store"
});
}
В этом сценарии сначала фиксируется политика хранения, затем инициализируется localForage.
Storage API также предоставляет возможность оценки доступного и занятого пространства:
const estimate = await navigator.storage.estimate();
console.log(estimate.usage);
console.log(estimate.quota);
Поля:
usage — объём используемой памяти;quota — общий лимит;usageDetails — детализация по типам хранилищ (в
некоторых браузерах).localForage может занимать значительную долю quota при хранении больших объектов, поэтому контроль использования важен для предотвращения принудительной очистки.
Если браузер отклоняет запрос, приложение продолжает работать в обычном режиме, но данные становятся уязвимыми:
Такая модель особенно критична для офлайн-first приложений, где localForage выступает основным хранилищем состояния.
Приложения, работающие без постоянного соединения с сервером, используют localForage для хранения:
Потеря таких данных делает приложение неработоспособным.
Progressive Web Apps часто комбинируют:
Persistent storage снижает риск очистки всей связанной структуры данных браузером.
Хранилища настроек, черновиков, прогресса или пользовательских конфигураций требуют устойчивости даже при очистке кэша.
Браузеры могут очищать временные хранилища при:
Persistent storage уменьшает вероятность таких действий, но не отменяет их полностью в случаях ручной очистки или системных ограничений.
Использование Storage API формирует дополнительный слой устойчивости поверх IndexedDB:
Такое разделение позволяет проектировать клиентские системы хранения с предсказуемым поведением даже в условиях ограниченных ресурсов браузера.