Константы INDEXEDDB, WEBSQL, LOCALSTORAGE

В библиотеке localForage выбор механизма хранения данных основан на концепции драйверов. Каждый драйвер представляет собой отдельную реализацию хранилища браузера с собственными характеристиками производительности, лимитов и совместимости. Для явного управления используются три встроенные константы: INDEXEDDB, WEBSQL, LOCALSTORAGE.

Эти значения не являются произвольными строками приложения, а представляют стандартизированные идентификаторы, используемые внутри localForage для определения backend-слоя хранения.


LOCALSTORAGE

LOCALSTORAGE — самый простой и наиболее широко поддерживаемый механизм хранения данных в браузерах.

Особенности:

  • синхронный API браузера
  • ограниченный объём (обычно около 5–10 МБ)
  • хранение только строковых значений
  • отсутствие индексации и сложных запросов
  • блокировка основного потока при интенсивных операциях

В localForage данный драйвер используется как fallback, когда более современные решения недоступны.

Поведение при работе через localForage:

  • любые значения сериализуются в JSON
  • доступ осуществляется асинхронно через обёртку Promise
  • возможны ограничения по скорости при больших объёмах данных

Пример использования:

localforage.setDriver(localforage.LOCALSTORAGE)
  .then(() => localforage.setItem('key', { a: 1 }));

LOCALSTORAGE часто применяется в средах с ограничениями, где IndexedDB недоступен, например в старых браузерах или некоторых embedded WebView.


WEBSQL

WEBSQL — устаревший, но всё ещё поддерживаемый в некоторых браузерах SQL-подобный механизм хранения.

Характеристики:

  • асинхронный API
  • основан на SQLite-подобном движке
  • поддерживает структурированные запросы
  • ограниченная и прекращённая спецификация (deprecated)
  • отсутствует в современных стандартах, но сохранён в части WebKit-браузеров

WEBSQL используется в localForage как промежуточный драйвер между LOCALSTORAGE и INDEXEDDB в системах, где IndexedDB работает нестабильно или недоступен.

Особенности поведения:

  • данные хранятся в таблицах внутри встроенной БД
  • операции выполняются через SQL-запросы
  • требует сериализации объектов перед записью

Пример явного указания:

localforage.setDriver(localforage.WEBSQL)
  .then(() => localforage.setItem('user', { name: 'Alex' }));

Несмотря на функциональность, WEBSQL рассматривается как legacy-решение и используется только в целях обратной совместимости.


INDEXEDDB

INDEXEDDB — основной современный механизм хранения, предназначенный для работы с большими объёмами структурированных данных.

Ключевые свойства:

  • асинхронная событийная модель
  • поддержка транзакций
  • хранение объектов без предварительной сериализации (через structured clone)
  • индексы и возможность сложных выборок
  • высокая производительность по сравнению с LOCALSTORAGE

В localForage этот драйвер является предпочтительным.

Поведение:

  • данные сохраняются как объекты
  • операции выполняются в транзакциях
  • поддерживается параллельная работа нескольких запросов
  • минимальное влияние на основной поток выполнения

Пример использования:

localforage.setDriver(localforage.INDEXEDDB)
  .then(() => localforage.setItem('settings', {
    theme: 'dark',
    version: 3
  }));

INDEXEDDB обеспечивает максимальную масштабируемость и используется как первый выбор при автоматическом выборе драйвера.


Приоритет и порядок использования констант

localForage использует механизм fallback-цепочки, основанный на доступности драйверов в браузере. Типичный порядок:

  1. INDEXEDDB
  2. WEBSQL
  3. LOCALSTORAGE

Этот порядок отражает эволюцию технологий:

  • IndexedDB как современный стандарт
  • WebSQL как устаревший промежуточный слой
  • LocalStorage как базовый резерв

При инициализации библиотека проверяет поддержку каждого драйвера и выбирает первый доступный вариант.

Пример конфигурации с явным порядком:

localforage.config({
  driver: [
    localforage.INDEXEDDB,
    localforage.WEBSQL,
    localforage.LOCALSTORAGE
  ],
  name: 'app_storage',
  storeName: 'keyvalue_pairs'
});

Использование в setDriver

Метод setDriver принимает одну или несколько констант и задаёт активный механизм хранения.

При передаче массива осуществляется последовательная попытка инициализации:

localforage.setDriver([
  localforage.INDEXEDDB,
  localforage.WEBSQL
]);

Логика выполнения:

  • перебор драйверов в указанном порядке
  • проверка поддержки среды
  • активация первого успешно инициализированного драйвера
  • отклонение Promise при отсутствии совместимых вариантов

Внутреннее представление констант

Каждая константа представляет собой строковый идентификатор драйвера внутри localForage:

  • INDEXEDDB'asyncStorage' (IndexedDB wrapper)
  • WEBSQL'webSQLStorage'
  • LOCALSTORAGE'localStorageWrapper'

Эти значения используются внутри фабрики драйверов для регистрации и выбора реализации.


Влияние выбора драйвера на API

Несмотря на единый интерфейс localForage, поведение операций зависит от выбранного драйвера.

Скорость операций

  • INDEXEDDB — высокая при больших объёмах
  • WEBSQL — средняя, зависит от реализации SQLite
  • LOCALSTORAGE — низкая при большом количестве данных

Масштабируемость

  • INDEXEDDB — до сотен мегабайт и выше
  • WEBSQL — ограничено реализацией браузера
  • LOCALSTORAGE — жёсткие квоты

Типы данных

  • INDEXEDDB — поддержка объектов и бинарных структур
  • WEBSQL — только сериализованные строки
  • LOCALSTORAGE — только строки

Проверка доступности драйвера

localForage позволяет проверять поддержку каждого механизма через supports():

localforage.supports(localforage.INDEXEDDB);
localforage.supports(localforage.WEBSQL);
localforage.supports(localforage.LOCALSTORAGE);

Возвращаемое значение определяет, можно ли использовать соответствующий драйвер в текущей среде.


Практическая роль констант в архитектуре приложения

Использование INDEXEDDB, WEBSQL и LOCALSTORAGE как явных констант позволяет:

  • управлять стратегией хранения данных
  • контролировать fallback-поведение
  • адаптировать приложение под ограничения среды
  • тестировать различные сценарии хранения
  • обеспечивать предсказуемость работы в разных браузерах

Выбор конкретного драйвера напрямую влияет на архитектуру persistence-слоя, особенно в приложениях с офлайн-режимом, кэшированием и локальными базами данных.