Явное указание одного драйвера

В localForage работа с хранилищами строится вокруг абстракции драйверов: IndexedDB, WebSQL и localStorage. По умолчанию библиотека использует стратегию выбора с fallback-механизмом, при котором сначала проверяется поддержка более современных механизмов, а затем происходит откат к более простым.

Однако во многих архитектурах требуется полностью исключить автоматический выбор и зафиксировать один конкретный драйвер. Это важно в случаях, когда:

  • требуется строгая предсказуемость поведения хранилища;
  • необходимо унифицировать поведение между окружениями;
  • проводится аудит производительности и важно исключить переключение между реализациями;
  • приложение рассчитано на конкретный браузерный стек.

Механика выбора драйвера внутри localForage

Библиотека хранит список доступных драйверов и перебирает их в порядке приоритета:

  1. IndexedDB (приоритетный вариант)
  2. WebSQL (устаревающий, но всё ещё поддерживаемый в некоторых окружениях)
  3. localStorage (резервный вариант)

При использовании стандартной конфигурации этот список используется как очередь: первый доступный драйвер становится активным.

Явное указание одного драйвера полностью отключает эту модель очереди.


Способы жёсткого указания драйвера

Установка через конфигурацию

Наиболее распространённый способ — задать параметр driver в config:

import localforage from "localforage";

localforage.config({
  driver: localforage.INDEXEDDB
});

В этом случае библиотека:

  • игнорирует остальные драйверы;
  • не выполняет fallback;
  • использует только IndexedDB, даже если он нестабилен или частично недоступен.

Указание через массив с единственным элементом

Технически API допускает передачу массива драйверов, где может быть указан только один элемент:

localforage.config({
  driver: [localforage.WEBSQL]
});

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


Использование setDriver для принудительного переключения

Метод setDriver применяется для смены активного драйвера после инициализации:

localforage.setDriver(localforage.LOCALSTORAGE);

Или в виде массива:

localforage.setDriver([localforage.LOCALSTORAGE]);

Поведение в этом режиме:

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

Константы драйверов

Внутри localForage используются предопределённые идентификаторы:

localforage.INDEXEDDB
localforage.WEBSQL
localforage.LOCALSTORAGE

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


Поведение при жёстком указании драйвера

Фиксация одного драйвера радикально меняет поведение системы:

Отсутствие fallback-логики

Если выбранный драйвер недоступен:

  • инициализация завершается ошибкой;
  • данные не переносятся в альтернативное хранилище;
  • операции чтения/записи не становятся доступными.

Стабильность API

После успешной инициализации:

  • все операции getItem, setItem, removeItem работают через один backend;
  • структура ключей и сериализация не изменяются;
  • поведение становится полностью предсказуемым.

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

Разные драйверы имеют различные характеристики:

  • IndexedDB — асинхронный, высокопроизводительный, подходит для больших объёмов;
  • WebSQL — средняя производительность, устаревшая реализация;
  • localStorage — синхронный, ограниченный по объёму и блокирующий основной поток.

Фиксация драйвера позволяет управлять этими характеристиками напрямую, без автоматического переключения.


Сценарии использования явного одного драйвера

1. Отключение нестабильных fallback-веток

В корпоративных приложениях иногда требуется гарантировать использование только IndexedDB:

localforage.config({
  driver: localforage.INDEXEDDB
});

Причина — исключение различий между браузерами и предотвращение неожиданных деградаций до localStorage.


2. Поддержка устаревших окружений

В средах, где IndexedDB может быть нестабилен, фиксируется WebSQL:

localforage.setDriver(localforage.WEBSQL);

Это позволяет сохранить совместимость со старыми WebView или legacy-браузерами.


3. Минимизация блокировок UI

localStorage является синхронным механизмом. При необходимости строгого контроля можно явно задать его:

localforage.config({
  driver: localforage.LOCALSTORAGE
});

Это может использоваться в очень простых приложениях, где асинхронность не критична.


Ошибки при жёстком указании драйвера

При принудительном выборе одного backend часто возникают типовые проблемы:

1. UnsupportedError

Возникает, если выбранный драйвер недоступен в окружении:

  • приватный режим браузера;
  • отключённые API;
  • ограничения безопасности iframe.

2. QuotaExceededError

Особенно характерно для localStorage:

  • превышение лимита хранения;
  • отсутствие автоматического расширения пространства.

3. TransactionError (IndexedDB)

При неправильной работе транзакций:

  • закрытие базы во время операции;
  • конфликт версий схемы.

Инициализация и порядок выполнения

Важно учитывать, что установка драйвера должна происходить до начала операций:

localforage.config({
  driver: localforage.INDEXEDDB,
  name: "app_storage"
});

await localforage.setItem("key", "value");

Если драйвер задаётся после первых операций, поведение может стать непредсказуемым из-за уже созданного инстанса хранилища.


Отличие конфигурации и переключения

Метод Поведение Когда применяется
config({ driver }) задаёт драйвер при инициализации начальная настройка
setDriver() переключает уже созданный инстанс динамическое управление
массив из одного драйвера формально fallback, фактически фиксация совместимость API

Влияние на архитектуру приложения

Жёсткое закрепление драйвера в localForage приводит к следующим архитектурным последствиям:

  • исчезает слой абстракции выбора backend;
  • упрощается тестирование (единая среда хранения);
  • повышается предсказуемость I/O-операций;
  • снижается переносимость между окружениями.

Взамен теряется автоматическая адаптация к возможностям платформы, что делает систему более жёстко привязанной к конкретной реализации хранения.