Исходный код библиотеки: архитектура и размер

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

Основные компоненты:

  1. Хранилище (Store) Объект Store представляет конкретное хранилище в IndexedDB. Он создается с помощью конструктора:

    import { Store } from 'idb-keyval';
    const myStore = new Store('my-database', 'my-store');

    Здесь 'my-database' — имя базы данных, 'my-store' — имя object store. При отсутствии этих параметров используются значения по умолчанию.

  2. Асинхронные функции CRUD Библиотека предоставляет набор функций для работы с данными:

    • get(key, store) — получает значение по ключу.
    • set(key, value, store) — записывает значение по ключу.
    • del(key, store) — удаляет запись по ключу.
    • clear(store) — очищает все данные хранилища.
    • keys(store) — возвращает массив всех ключей.
    • update(key, updater, store) — обновляет значение по ключу с помощью функции-обработчика.

Эти функции используют Promises для асинхронной работы, что полностью избавляет от необходимости писать сложные обработчики событий (onsuccess, onerror) стандартного IndexedDB API.

Принцип работы

Все операции над данными в idb-keyval проходят через следующие шаги:

  1. Открытие базы данных Если база данных с указанным именем отсутствует, создается новая. Этот процесс выполняется через indexedDB.open, а сама библиотека оборачивает событие onsuccess в Promise.

  2. Создание object store При первом открытии базы данных автоматически создается object store с ключом keyPath, если он не задан явно. Это обеспечивает совместимость с API функций библиотеки.

  3. Транзакции Для каждой операции создается короткая транзакция типа readonly или readwrite:

    • readonly используется для чтения (get, keys).
    • readwrite используется для изменения данных (set, del, clear, update).
  4. Асинхронная обработка ошибок Все ошибки IndexedDB автоматически обрабатываются и пробрасываются в отклонение Promise. Это делает API idb-keyval безопасным для использования без необходимости явной проверки event.target.error.

Размер и оптимизация

idb-keyval отличается минимализмом и небольшим размером:

  • Размер npm-пакета: около 1–2 КБ в минифицированном виде без зависимостей.
  • Зависимости: библиотека не использует сторонние зависимости, что снижает вероятность конфликтов и упрощает интеграцию.
  • Производительность: idb-keyval использует короткие транзакции и открывает базы данных по мере необходимости, что снижает накладные расходы и ускоряет работу в браузере.

Исходный код и структура файлов

Исходный код библиотеки построен как модуль ES6 и содержит следующие элементы:

  1. store.js — описание класса Store и создание базового хранилища.
  2. idb.js — обертка над IndexedDB, реализация открывания базы, транзакций и Promise-интерфейса.
  3. methods.js — реализация всех публичных функций (get, set, del, clear, keys, update) с указанием параметра store.
  4. index.js — точка входа, экспортирует все функции и конструктор Store.

Все функции максимально лаконичны, в среднем по 5–15 строк кода каждая, что позволяет легко отслеживать поток данных и логику работы.

Преимущества архитектуры

  • Легкость расширения: при необходимости можно создать свои функции, используя Store и базовые методы транзакций.
  • Совместимость с Promise и async/await: все функции возвращают Promise, что упрощает асинхронный код.
  • Минимальная сложность: нет лишних абстракций, весь функционал концентрирован вокруг CRUD-операций.

Выводы по архитектуре и размеру

idb-keyval — это пример максимально минималистичной и эффективной обертки над IndexedDB. Архитектура основана на простом объекте Store и коротких асинхронных транзакциях. Небольшой размер библиотеки и отсутствие зависимостей делают её идеальным решением для проектов, где требуется лёгкое, но надежное хранилище ключ-значение в браузере.