Порядок вызова config до первой операции

Библиотека localForage строится вокруг отложенной инициализации хранилища. Внутри она выбирает подходящий драйвер (IndexedDB, WebSQL или localStorage), создаёт пространство хранения и кэширует выбранную конфигурацию. Именно поэтому момент вызова конфигурации критически влияет на поведение всей системы.

До выполнения первой операции чтения или записи localForage находится в состоянии ленивой подготовки. В этот период происходит:

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

Любое изменение конфигурации после запуска этого процесса уже не всегда приводит к переинициализации внутреннего состояния.


Что именно делает config внутри localForage

Метод config задаёт глобальные параметры экземпляра localForage, которые используются при создании драйвера и формировании пространства хранения:

  • name — имя базы данных;
  • storeName — имя хранилища внутри базы;
  • version — версия структуры (актуально преимущественно для IndexedDB);
  • driver — приоритетный список драйверов.

Эти параметры участвуют в формировании ключевых идентификаторов хранилища и влияют на:

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

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


Момент первого обращения как граница конфигурации

localForage использует ленивую стратегию: реальная инициализация происходит при первом вызове любой операции (setItem, getItem, keys и т.д.). До этого момента конфигурация ещё может быть учтена в полном объёме.

После первого обращения запускается цепочка:

  1. выбор драйвера;
  2. открытие или создание хранилища;
  3. инициализация внутреннего состояния;
  4. кэширование адаптера.

Если config вызывается после этого этапа, поведение зависит от внутреннего состояния драйвера:

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

Таким образом, граница между «до» и «после» первой операции фактически определяет валидность конфигурации.


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

Изменение конфигурации после начала работы приводит к ряду неочевидных эффектов:

Несовпадение хранилищ

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

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

Частичная смена драйвера

При изменении driver после инициализации переключение может не произойти без явного пересоздания внутреннего адаптера. В результате:

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

Несогласованность версий

Параметр version особенно чувствителен в IndexedDB. Он влияет на схему базы и триггер обновления структуры. При позднем изменении:

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

Внутренний кэш драйвера и его влияние на конфигурацию

После первой операции localForage сохраняет:

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

Этот кэш делает работу быстрой, но одновременно фиксирует конфигурационные решения. Повторный вызов config не приводит к пересборке всех компонентов, потому что это нарушило бы стабильность соединений и могло бы привести к потере данных.

Поэтому архитектурно localForage ориентирован на «конфигурацию до старта работы», а не на динамическую перенастройку.


Особенности поведения в модульных приложениях

В современных JavaScript-приложениях localForage часто импортируется как единый singleton:

  • React-приложения;
  • Vue SPA;
  • Node-like сборки с SSR-обвязкой;
  • микрофронтенды.

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

Если один модуль вызывает setItem раньше, чем другой модуль успевает выполнить config, происходит следующая ситуация:

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

Асинхронные гонки при инициализации

localForage работает асинхронно, но конфигурация — синхронная операция. Это создаёт потенциальные гонки:

  • модуль A вызывает config;
  • модуль B почти одновременно вызывает getItem;
  • драйвер инициализируется до применения нужных параметров.

В результате возникает состояние, при котором:

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

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


Инициализация через слой абстракции

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

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

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

Влияние на тестирование и окружения

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

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

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


Поведение при повторных вызовах config

Повторные вызовы config не эквивалентны повторной инициализации библиотеки. Они:

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

Таким образом, конфигурация в localForage носит характер «одноразового контракта» перед стартом работы, а не динамического управления состоянием.