Приватный (инкогнито) режим браузеров радикально меняет модель работы
клиентских хранилищ. Основная цель таких режимов — минимизация или
полное исключение долговременного следа данных пользователя после
завершения сессии. Это напрямую влияет на поведение Web Storage API,
IndexedDB и, как следствие, библиотек, работающих поверх них, включая
localForage.
В разных браузерах ограничения реализованы по-разному:
- В одних случаях хранилище существует, но очищается после закрытия
вкладки или окна.
- В других — доступ к IndexedDB может быть частично или полностью
ограничен.
- Иногда браузер переключается на урезанную или временную реализацию
хранилищ.
Ключевая особенность
Приватный режим не стандартизирован, и localForage
вынужден работать не с единым поведением платформы, а с набором
несовместимых реализаций.
Как
localForage адаптируется к приватному режиму
localForage построен как абстракция над несколькими драйверами
хранения:
- IndexedDB (основной вариант)
- WebSQL (устаревший, но иногда доступный)
- localStorage (fallback)
В приватном режиме выбор драйвера становится критическим,
поскольку:
- IndexedDB может быть недоступен или нестабилен
- quota может быть сильно ограничена
- операции записи могут завершаться ошибками безопасности
Алгоритм выбора драйвера
localForage выполняет последовательную проверку доступности:
- Проверка IndexedDB
- Проверка WebSQL (если включён)
- Переход на localStorage
При этом метод _support каждого драйвера играет ключевую
роль: он проверяет не только наличие API, но и возможность реальной
записи.
IndexedDB в приватном режиме
Safari (iOS/macOS)
Наиболее строгая модель:
- IndexedDB может возвращать ошибки
SecurityError
- или создавать хранилище, которое не сохраняет данные между
сессиями
- в некоторых версиях доступ полностью блокируется
В результате localForage часто вынужден откатываться на localStorage
или memory-like поведение.
Chrome / Chromium
- IndexedDB обычно доступен
- но данные могут быть эпhemeral (временные)
- при закрытии окна все данные удаляются
- quota может быть уменьшена
Особенность: API ведёт себя как обычный IndexedDB, что создаёт
иллюзию постоянства.
Firefox
- Более стабильная модель
- IndexedDB обычно доступен даже в приватном режиме
- но данные привязаны к сессии и очищаются после завершения
localStorage в приватном
режиме
localStorage в инкогнито режиме:
- часто работает как обычный API
- но данные не гарантированно сохраняются
- может иметь строгие ограничения по объёму
- иногда очищается при закрытии последнего приватного окна
localForage использует localStorage только как fallback, но в
приватных режимах это может стать единственным доступным вариантом.
Поведение
localForage при ошибках хранения
QuotaExceededError
Возникает при превышении лимита памяти. В приватном режиме лимиты
обычно существенно ниже.
localForage:
- не гарантирует автоматическое переключение драйвера
- ошибка передаётся через Promise rejection
- требует внешней стратегии обработки
SecurityError
Часто встречается в Safari private mode:
- доступ к IndexedDB запрещён
- создание базы данных невозможно
В этом случае localForage:
- пропускает IndexedDB драйвер
- переходит к следующему доступному варианту
InvalidStateError
Может возникать при:
- попытке использовать закрытую базу
- разрушении storage context браузером
Временное (ephemeral)
хранилище
В приватном режиме многие браузеры используют концепцию временного
storage:
- данные существуют только в рамках сессии
- уничтожаются при закрытии окна или вкладки
- иногда изолируются между вкладками
Для localForage это означает:
setItem и getItem работают корректно
- но долговременность полностью отсутствует
- поведение эквивалентно in-memory кешу
Влияние на инициализацию
localForage
Метод config и инициализация экземпляра становятся
критичными:
import localForage from "localforage";
const store = localForage.createInstance({
name: "app_storage",
storeName: "cache"
});
В приватном режиме возможны следующие сценарии:
- IndexedDB не инициализируется → fallback на localStorage
- localStorage ограничен → деградация до минимального хранения
- все persistent storage запрещены → поведение как временный кеш
Асинхронная природа
деградации
Особенность localForage заключается в том, что проверка драйвера
происходит асинхронно. Это приводит к важному эффекту:
- приложение может начать работу, считая, что IndexedDB доступен
- ошибка проявляется только при первой записи
- fallback происходит уже постфактум
Это особенно заметно в приватных режимах Safari.
Поведение методов
setItem/getItem/removeItem
setItem
- может завершиться успешно, но данные не будут сохранены после
сессии
- может вернуть rejection без сохранения
- в случае fallback переключается на другой драйвер
getItem
- всегда работает в рамках текущей сессии
- не отличает временное и постоянное хранилище
- возвращает данные без информации о долговечности
removeItem
- часто работает без ошибок
- но не гарантирует физическое освобождение памяти
Очистка данных и жизненный
цикл
В приватном режиме жизненный цикл данных зависит от браузера:
- закрытие вкладки → очистка storage context
- закрытие окна → уничтожение всей базы
- бездействие → возможная агрессивная очистка памяти
localForage не имеет механизма контроля этих процессов, так как они
находятся на уровне браузера.
Особенности
кэширования и производительности
Приватный режим часто влияет на:
- скорость операций IndexedDB
- лимиты транзакций
- параллельные записи
localForage, как абстракция, может демонстрировать:
- увеличение latency операций
- нестабильность write-after-read цепочек
- неожиданные сбросы состояния при нагрузке
Стратегии устойчивой работы
Проверка доступности
драйвера
Использование driver() и setDriver()
позволяет заранее зафиксировать поведение:
localForage.setDriver([
localForage.INDEXEDDB,
localForage.LOCALSTORAGE
]);
В приватном режиме это снижает количество неожиданных
переключений.
Использование
fallback-логики
При критичных данных применяется многоуровневая стратегия:
- IndexedDB для основной работы
- localStorage для минимального состояния
- memory cache как последний уровень
Минимизация объёма данных
В приватных режимах особенно важно:
- хранить только агрегированные данные
- избегать больших blob-структур
- очищать кеш вручную
Особенности многовкладочной
работы
В приватном режиме вкладки часто изолированы:
- IndexedDB может быть недоступен для shared state
- изменения не синхронизируются
- localStorage события
storage могут не срабатывать
localForage не компенсирует это поведение, так как оно находится вне
его уровня абстракции.
Поведение в режиме
строгой изоляции сайта
Некоторые браузеры используют site isolation даже в приватном
режиме:
- отдельное хранилище для каждой вкладки
- невозможность совместного доступа
- сброс данных при переходах между контекстами
Это делает localForage фактически одно-вкладочным кешем.
Ограничения
архитектуры localForage в приватном режиме
Основные ограничения:
- отсутствие гарантии персистентности
- невозможность предсказать fallback-драйвер
- зависимость от поведения браузера
- отсутствие сигналов о “временности” storage
Поведение при повторной
инициализации
При повторном создании экземпляра:
- драйвер может быть выбран заново
- состояние IndexedDB не восстанавливается
- localStorage может содержать устаревшие данные
Это создаёт риск рассинхронизации логики приложения.
Сценарии деградации
На практике встречаются следующие модели:
Полная поддержка IndexedDB
- работает как обычный режим
- данные временные
Частичная поддержка
- IndexedDB доступен, но нестабилен
- ошибки при записи
Полный fallback
- используется localStorage
- ограниченный объём
Memory-only режим
- данные живут только в runtime
- полная потеря при обновлении
Итоговые технические
особенности поведения
- приватный режим не унифицирован между браузерами
- localForage не имеет прямого контроля над persistence слоями
- IndexedDB может вести себя как временное хранилище
- fallback-драйверы становятся основной рабочей средой
- гарантии сохранности данных отсутствуют на уровне платформы