idb-keyval — это минималистичная библиотека для работы с
IndexedDB в браузере, которая упрощает хранение и извлечение данных.
Основная особенность, определяющая возможности хранения, — это
использование структурированного клонирования
(structured cloning). Этот механизм позволяет сохранять не только
простые типы данных, но и сложные объекты, массивы, Map, Set и другие
структуры, поддерживаемые браузером.
Библиотека автоматически поддерживает все типы, которые могут быть структурно клонированы:
string,
number, boolean, null,
undefined.Uint8Array,
Float32Array, DataView.Не все объекты можно сохранить через структурированное клонирование. Ограничения связаны с особенностями браузерного API IndexedDB:
function не
клонируется, будет потеряна при сохранении.HTMLElement,
DocumentFragment и подобные объекты нельзя хранить.Symbol): не сохраняются.Map и Set в idb-keyval
сохраняются в виде клонированной структуры, без потери данных. Это
отличается от обычного преобразования в JSON, где Map
превращается в массив массивов, а Set — в массив значений.
Пример использования:
import { set, get } from 'idb-keyval';
const userPreferences = new Map([
['theme', 'dark'],
['notifications', true]
]);
await set('prefs', userPreferences);
const prefs = await get('prefs');
console.log(prefs.get('theme')); // dark
Структурированное клонирование позволяет хранить объекты любой глубины, включая массивы объектов и вложенные структуры. Пример:
import { set, get } from 'idb-keyval';
const sessionData = {
user: { id: 123, name: 'Alex' },
tokens: ['abc', 'def'],
settings: { theme: 'light', fontSize: 14 },
lastLogin: new Date()
};
await set('session', sessionData);
const restored = await get('session');
console.log(restored.lastLogin instanceof Date); // true
Особенность здесь в том, что Date сохраняется корректно,
а вложенные объекты полностью восстанавливаются без необходимости
ручного сериализатора.
Для больших бинарных данных (Blob,
ArrayBuffer) структурированное клонирование эффективно, но
иногда имеет смысл использовать дополнительные подходы:
Blob вместо Base64-кодирования для
экономии памяти.ReadableStream с
последующим сохранением чанков.В отличие от JSON.stringify, структурированное
клонирование:
Date, Map,
Set) без потери информации.ArrayBuffer,
Blob) напрямую.Некорректные типы данных вызывают ошибки на этапе записи:
import { set } from 'idb-keyval';
const invalid = {
fn: () => console.log('hi')
};
await set('invalid', invalid); // DOMException: The object could not be cloned
Для безопасного хранения необходимо заранее фильтровать неподдерживаемые типы или преобразовывать их в примитивные представления.
Blob, TypedArray или разбивать данные на
части.Структурированное клонирование обеспечивает гибкое и надёжное
хранение практически любых данных в IndexedDB через
idb-keyval, сохраняя типы и структуру без ручного
сериализатора и десериализатора.