Создание кастомного хранилища через createStore

Библиотека idb-keyval предоставляет упрощённый интерфейс для работы с IndexedDB в браузере. Основной функционал стандартного API ограничен глобальным хранилищем, но для проектов с несколькими независимыми базами данных или объектными хранилищами используется функция createStore. Она позволяет создавать собственные экземпляры хранилища с уникальным именем базы данных и именем объекта (object store).

Синтаксис:

import { createStore } from 'idb-keyval';

const myStore = createStore(dbName, storeName);
  • dbName — имя базы данных (тип: string). Если база с указанным именем не существует, она создаётся автоматически.
  • storeName — имя объекта хранилища в базе (тип: string). Если объектное хранилище отсутствует, оно создаётся при открытии базы.

Каждый созданный объект myStore может использоваться с методами get, set, del, clear, keys, update и другими функциями idb-keyval, принимающими в качестве первого аргумента именно этот экземпляр.


Использование кастомного хранилища с get и set

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

import { get, set } from 'idb-keyval';

const myStore = createStore('userDB', 'preferences');

// Запись значения
await set('theme', 'dark', myStore);

// Чтение значения
const theme = await get('theme', myStore);
console.log(theme); // 'dark'

Ключевые моменты:

  • Каждое хранилище работает автономно, что позволяет разделять данные разных модулей.
  • Методы возвращают Promise, что позволяет интегрировать их в асинхронный код через await или then.
  • Ключи и значения могут быть любыми сериализуемыми объектами, включая объекты, массивы и примитивы.

Полный контроль над объектным хранилищем

Функция createStore позволяет управлять не только именами, но и версией базы данных через дополнительный параметр version в настройках:

import { createStore } from 'idb-keyval';

const myStore = createStore('userDB', 'preferences', { version: 2 });
  • При изменении версии базы автоматически вызывается onupgradeneeded, что позволяет создавать новые object store или изменять структуру существующих.
  • Поддержка версий критична для приложений, где структура данных может меняться со временем.

Работа с несколькими хранилищами

В крупных приложениях часто требуется несколько независимых хранилищ. Пример:

const settingsStore = createStore('appDB', 'settings');
const cacheStore = createStore('appDB', 'cache');

await set('language', 'ru', settingsStore);
await set('homepage', { visited: true }, cacheStore);

const language = await get('language', settingsStore);
const homepageData = await get('homepage', cacheStore);

Выделенные преимущества:

  • Полная изоляция данных разных модулей.
  • Возможность выполнять операции очистки (clear) по отдельному хранилищу, не затрагивая другие.
  • Совместное использование одной базы с разными object store без конфликта ключей.

Обновление и удаление данных

Все методы idb-keyval принимают кастомное хранилище как опциональный третий аргумент. Примеры:

import { del, update } from 'idb-keyval';

// Удаление значения
await del('theme', myStore);

// Обновление значения
await update('counter', (n = 0) => n + 1, myStore);

Особенности метода update:

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

Итоговые рекомендации по работе с createStore

  • Для каждой логической области приложения создаётся отдельное хранилище.
  • Версия базы должна контролироваться при изменении структуры object store.
  • Для кэширования, пользовательских настроек или данных модулей лучше использовать отдельные object store, чтобы минимизировать риски потери данных при очистке.

Кастомные хранилища через createStore делают работу с IndexedDB максимально гибкой, сохраняя простоту API idb-keyval и обеспечивая масштабируемость для сложных приложений на JavaScript.