localForage строится вокруг унифицированного API поверх различных механизмов хранения браузера: IndexedDB, WebSQL и localStorage. При этом ключевым аспектом является то, что все значения проходят через слой сериализации и десериализации, поведение которого зависит от выбранного драйвера.
Главная особенность архитектуры заключается в попытке абстрагировать
различия между хранилищами, сохраняя единый интерфейс
setItem / getItem. Однако именно на этапе преобразования
данных в формат, пригодный для хранения, возникают основные
ограничения.
При использовании IndexedDB применяется алгоритм structured clone, который поддерживает более богатые типы данных по сравнению с JSON.
Поддерживаемые типы:
Особенность structured clone заключается в том, что данные не превращаются в строку, а копируются в бинарное представление, пригодное для хранения внутри базы.
Ключевая характеристика:
JSON.stringifyОднако даже в этом случае сохраняются ограничения:
При использовании localStorage данные всегда преобразуются в строки. localForage в этом случае использует JSON-сериализацию как промежуточный слой.
Последствия такого подхода:
Типичные преобразования:
Date → строка ISOArrayBuffer → невозможен без ручного
преобразованияundefined → теряется (ключ может быть удалён или
сериализован некорректно)NaN, Infinity → становятся
null или строками в зависимости от реализации JSONТакже localStorage накладывает собственные ограничения:
Слой абстракции localForage не реализует полноценную систему типизации объектов при сериализации. В результате восстановление данных после чтения зависит от драйвера.
При IndexedDB:
При localStorage:
Это приводит к тому, что код, зависящий от строгих типов, становится чувствительным к выбору драйвера.
Даже при работе через IndexedDB localForage может использовать JSON как fallback-слой в определённых конфигурациях. В этом случае проявляются классические ограничения JSON:
undefinedSymbolЦиклические структуры требуют предварительного разрыва ссылок или использования специализированных структур данных.
localForage поддерживает хранение бинарных данных, но поведение зависит от драйвера.
Это приводит к существенной разнице в производительности и объёмах хранимых данных.
Несмотря на стандартизацию IndexedDB, поведение structured clone имеет различия:
localForage скрывает часть этих различий, но не устраняет их полностью, особенно при использовании нестабильных или устаревших окружений.
Каждый драйвер накладывает собственные ограничения:
Дополнительные аспекты:
При переключении драйвера или миграции между версиями хранилища возникают проблемы:
Особенно критично это при переходе:
В таких случаях данные могут требовать полной перекодировки.
localForage использует ключ-значение модель без встроенной схемы.
Ограничения:
Это влияет на архитектуру данных, требуя хранения уже готовых структур, а не нормализованных моделей.
Ошибки сериализации могут возникать в следующих случаях:
Типичное поведение:
Каждая операция чтения и записи фактически создает копию объекта:
Это важно при работе с большими структурами данных, так как приводит к дополнительной нагрузке на память и GC.