Полная сигнатура createInstance

Метод createInstance в localForage предназначен для создания изолированных экземпляров хранилища с независимой конфигурацией. Каждый экземпляр функционирует как отдельный контейнер для ключ-значение данных, при этом может использовать собственный драйвер, префиксы, имя базы и настройки сериализации.

Сигнатура метода

const store = localforage.createInstance(options);

Параметр options представляет собой объект конфигурации:

{
  name?: string,
  storeName?: string,
  driver?: string | string[],
  size?: number,
  version?: number,
  description?: string,
  driverOrder?: string[],
  namePrefix?: string
}

Возвращаемое значение — новый экземпляр localForage, полностью совместимый с основным API библиотеки.


Назначение и изоляция экземпляров

Каждый вызов createInstance создаёт отдельное логическое пространство хранения. Это достигается за счёт комбинации параметров:

  • name
  • storeName
  • внутреннего префикса ключей
  • выбранного драйвера

Даже при использовании одного и того же физического хранилища (например, IndexedDB), данные разных экземпляров не пересекаются.

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


Параметры конфигурации

name

Определяет имя базы данных (в контексте IndexedDB или WebSQL).

  • Используется как уровень изоляции
  • Влияет на физическое хранилище
  • При разных значениях создаются разные базы
localforage.createInstance({
  name: 'appA'
});

storeName

Логическая таблица (object store) внутри базы.

  • Основной механизм разделения данных
  • Используется в IndexedDB
  • В WebSQL и localStorage эмулируется через префиксы
localforage.createInstance({
  name: 'appA',
  storeName: 'cache'
});

driver

Определяет используемый механизм хранения:

  • IndexedDB
  • WebSQL
  • localStorage

Можно задать строкой или массивом (fallback-цепочка):

localforage.createInstance({
  driver: [
    localforage.INDEXEDDB,
    localforage.WEBSQL,
    localforage.LOCALSTORAGE
  ]
});

Приоритет определяется порядком элементов.


size

Применяется только к WebSQL.

  • задаёт максимальный размер базы
  • игнорируется другими драйверами

version

Используется в IndexedDB для версионирования схемы.

  • изменение версии может инициировать upgrade
  • влияет на пересоздание object store

description

Человекочитаемое описание базы.

  • не влияет на поведение
  • используется для диагностики

driverOrder

Альтернативный способ задания fallback-цепочки драйверов.

localforage.createInstance({
  driverOrder: [
    'indexeddb',
    'websql',
    'localstorage'
  ]
});

namePrefix

Добавочный префикс для ключей в хранилище.

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

Поведение экземпляра

Созданный экземпляр повторяет API глобального объекта:

const store = localforage.createInstance({ name: 'app' });

store.setItem('key', 'value');
store.getItem('key');
store.removeItem('key');
store.clear();
store.keys();
store.length();
store.iterate();

Однако внутреннее пространство ключей полностью отделено от основного localforage.


Принцип независимости контекстов

Каждый экземпляр:

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

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


Модель хранения данных

При использовании createInstance формируется комбинация идентификаторов:

database name + store name + driver namespace + prefix

В IndexedDB это соответствует:

  • database: name
  • objectStore: storeName

В localStorage:

  • ключи формируются с префиксом

Пример изолированных хранилищ

const authStore = localforage.createInstance({
  name: 'app',
  storeName: 'auth'
});

const cacheStore = localforage.createInstance({
  name: 'app',
  storeName: 'cache'
});

Несмотря на общий name, данные разделены по storeName.


Использование разных драйверов в экземплярах

const fastStore = localforage.createInstance({
  driver: localforage.LOCALSTORAGE
});

const persistentStore = localforage.createInstance({
  driver: localforage.INDEXEDDB
});

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


Влияние createInstance на сериализацию

Каждый экземпляр использует общую систему сериализации localForage, если явно не переопределены настройки.

Однако:

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

Особенности повторного создания экземпляров

Повторный вызов createInstance с одинаковыми параметрами:

const a = localforage.createInstance({ name: 'app', storeName: 'cache' });
const b = localforage.createInstance({ name: 'app', storeName: 'cache' });

создаёт два независимых объекта API, но обращающихся к одному и тому же хранилищу.

Это означает:

  • данные общие
  • ссылки на экземпляры разные
  • состояние не синхронизируется через объект, только через storage backend

Ограничения конфигурации

Некоторые параметры имеют платформенные ограничения:

  • size работает только в WebSQL
  • version актуален только для IndexedDB
  • driver может быть проигнорирован, если недоступен
  • namePrefix не гарантирует изоляцию в IndexedDB

Типовые сценарии применения

  • разделение кэша и пользовательских данных
  • мульти-tenant архитектуры в браузере
  • изоляция модулей одного SPA
  • переключение стратегий хранения данных без глобального влияния
  • создание временных и постоянных storage-слоёв

Внутреннее поведение и инициализация

При вызове createInstance происходит:

  1. клонирование базового объекта localForage
  2. применение конфигурации к новому контексту
  3. подготовка драйверов (без немедленного открытия базы)
  4. ленивое подключение storage при первом вызове операции

Инициализация фактически отложена до первого обращения к setItem, getItem и аналогичным методам.


Совместимость с глобальным экземпляром

Глобальный localforage и экземпляры:

  • используют одинаковые драйверы
  • могут работать параллельно
  • не конфликтуют при корректной настройке name/storeName
  • могут обращаться к одному backend при совпадающей конфигурации

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

const store = localforage.createInstance({ name: 'app' });

store.config({ name: 'other' });

Изменение конфигурации:

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

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


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

Использование createInstance практически не влияет на runtime:

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

Основное влияние связано не с самим экземпляром, а с выбранным storage backend.


Архитектурная роль метода

createInstance является механизмом:

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

Внутри localForage он выступает как ключевой инструмент мульти-контекстной работы с клиентским хранилищем.