Idb-keyval — это лёгкая обёртка для работы с IndexedDB в
браузере, упрощающая хранение и извлечение ключ-значение данных.
Основная цель библиотеки — дать возможность использовать асинхронное
хранилище без сложной схемы запросов IndexedDB.
Базовые методы включают:
undefined, если ключ отсутствует.Все методы возвращают промисы, что позволяет использовать
async/await для удобной работы.
Idb-keyval умеет хранить любые объекты, поддерживаемые
сериализацией через structured clone algorithm, включая
Date, Map, Set и ArrayBuffer.
Дата хранится в виде полноценного объекта Date, а не
строки. Это значит, что после извлечения из IndexedDB сохраняются все
методы объекта Date.
import { set, get } from 'idb-keyval';
const now = new Date();
await set('currentDate', now);
const storedDate = await get('currentDate');
console.log(storedDate instanceof Date); // true
console.log(storedDate.toISOString()); // корректная дата
Важно помнить: при передаче дат через JSON они превращаются в строки,
но idb-keyval сохраняет их как объекты, что позволяет
работать с ними без конверсии.
Map хранится целиком со всеми ключами и значениями. Это полезно для случаев, когда требуется ассоциативный массив с объектными ключами.
const map = new Map([
['name', 'Alice'],
['age', 25]
]);
await set('userMap', map);
const storedMap = await get('userMap');
console.log(storedMap instanceof Map); // true
console.log(storedMap.get('name')); // Alice
Map сохраняет порядок вставки элементов, что гарантирует предсказуемое извлечение данных.
Set сохраняет уникальные значения, что удобно для хранения коллекций без дубликатов.
const setData = new Set([1, 2, 3, 2]);
await set('numbers', setData);
const storedSet = await get('numbers');
console.log(storedSet instanceof Set); // true
console.log([...storedSet]); // [1, 2, 3]
Set позволяет легко проверять наличие элемента с помощью метода
has, а также поддерживает итерацию в сохранённом
порядке.
ArrayBuffer используется для хранения бинарных данных.
Idb-keyval сохраняет их напрямую без преобразования в
Base64 или другие форматы.
const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);
view.set([10, 20, 30, 40, 50, 60, 70, 80]);
await set('binaryData', buffer);
const storedBuffer = await get('binaryData');
const storedView = new Uint8Array(storedBuffer);
console.log(storedView); // Uint8Array(8) [10, 20, 30, 40, 50, 60, 70, 80]
Работа с ArrayBuffer удобна для хранения изображений, аудио или любых других бинарных форматов.
Все операции idb-keyval возвращают промисы, что упрощает
обработку ошибок и последовательность действий.
try {
await set('key', 'value');
const value = await get('key');
console.log(value);
} catch (error) {
console.error('Ошибка при работе с IndexedDB:', error);
}
Такой подход устраняет необходимость использовать сложные колбэки и обеспечивает чистый асинхронный код.
По умолчанию idb-keyval создаёт стандартное хранилище
keyval. Можно создавать собственные базы данных и
хранилища:
import { Store, set, get } from 'idb-keyval';
const customStore = new Store('my-database', 'my-store');
await set('customKey', 123, customStore);
const value = await get('customKey', customStore);
console.log(value); // 123
Это полезно для разделения данных по категориям или создания отдельных слоёв для разных приложений.
Idb-keyval делает работу с этими типами безопасной и
удобной, избавляя от необходимости ручной сериализации и десериализации,
что особенно важно при сложных структурах данных и современных
веб-приложениях.