Метод createInstance используется для создания
отдельного экземпляра localForage с независимой конфигурацией. Каждый
такой экземпляр работает как изолированное хранилище, не влияя на
глобальные настройки и другие экземпляры.
Ключевая идея — мультихранилищность внутри одного приложения:
const store = localForage.createInstance(options);
options — объект конфигурации, аналогичный глобальной
настройке, но применяемый только к конкретному экземпляру.
Экземпляр может быть настроен независимо от глобального состояния:
const userStore = localForage.createInstance({
name: 'appDB',
storeName: 'users',
driver: localForage.INDEXEDDB
});
Разбор параметров:
name — имя базы данных (логическое разделение на уровне storage engine)
storeName — имя object store (особенно важно для IndexedDB)
driver — приоритет или конкретный драйвер хранения:
Каждый экземпляр работает независимо:
const a = localForage.createInstance({
name: 'db',
storeName: 'moduleA'
});
const b = localForage.createInstance({
name: 'db',
storeName: 'moduleB'
});
await a.setItem('key', 'A');
await b.setItem('key', 'B');
Несмотря на одинаковую базу db, данные не пересекаются
из-за разных storeName.
Глобальная настройка:
localForage.config({
name: 'appDB',
storeName: 'default'
});
Ограничения:
Экземпляры через createInstance:
Каждый экземпляр может использовать собственный набор драйверов:
const idbStore = localForage.createInstance({
name: 'db',
storeName: 'fast',
driver: localForage.INDEXEDDB
});
const lsStore = localForage.createInstance({
name: 'db',
storeName: 'fallback',
driver: localForage.LOCALSTORAGE
});
Логика применения:
Экземпляры можно создавать один раз и переиспользовать:
const cacheStore = localForage.createInstance({
name: 'cacheDB',
storeName: 'responses'
});
async function saveResponse(key, data) {
return cacheStore.setItem(key, data);
}
Преимущества:
Хотя createInstance сам по себе синхронный, драйвер
внутри может инициализироваться асинхронно.
Типичный паттерн:
const store = localForage.createInstance({
name: 'db',
storeName: 'initTest'
});
await store.ready();
Метод ready() гарантирует, что выбранный драйвер
полностью инициализирован.
Ключи всегда локальны для конкретного экземпляра:
const users = localForage.createInstance({
name: 'db',
storeName: 'users'
});
const settings = localForage.createInstance({
name: 'db',
storeName: 'settings'
});
await users.setItem('theme', 'dark');
await settings.setItem('theme', 'light');
Несмотря на одинаковый ключ theme, значения не
конфликтуют.
Типовая сегментация:
const authStore = localForage.createInstance({
name: 'app',
storeName: 'auth'
});
const profileStore = localForage.createInstance({
name: 'app',
storeName: 'profile'
});
const cacheStore = localForage.createInstance({
name: 'app',
storeName: 'cache'
});
Логика:
Возможен шаблонный подход:
const baseConfig = {
name: 'appDB',
driver: localForage.INDEXEDDB
};
const productsStore = localForage.createInstance({
...baseConfig,
storeName: 'products'
});
const ordersStore = localForage.createInstance({
...baseConfig,
storeName: 'orders'
});
Это снижает дублирование конфигурации и упрощает поддержку.
Использование createInstance влияет на архитектурную, но
не на вычислительную сложность:
createInstanceОптимальный подход — создавать экземпляры на уровне модулей, а не внутри функций.
Неправильное ожидание глобальности:
const a = localForage.createInstance({ storeName: 'a' });
const b = localForage.createInstance({ storeName: 'b' });
// ожидание общего пространства данных — ошибка архитектуры
Создание экземпляров в циклах:
for (let i = 0; i < 100; i++) {
localForage.createInstance({ storeName: 'store' + i });
}
Это приводит к:
Все методы экземпляра остаются асинхронными:
const store = localForage.createInstance({
name: 'app',
storeName: 'data'
});
store.setItem('id', 123)
.then(() => store.getItem('id'))
.then(value => {
console.log(value);
});
или через async/await:
const value = await store.getItem('id');
Экземпляр фиксирует драйвер при инициализации:
const store = localForage.createInstance({
driver: localForage.LOCALSTORAGE
});
Если драйвер недоступен:
В крупных приложениях используется стратегия:
Пример слоистой архитектуры:
Каждый слой — отдельный createInstance.