Idb-keyval — это удобная обёртка над IndexedDB,
предназначенная для простого хранения ключ-значение. Несмотря на
гибкость библиотеки, не все типы данных можно сохранять напрямую.
Понимание этих ограничений критически важно для корректной работы
приложения и предотвращения неожиданных ошибок при чтении данных.
Основное правило: данные, которые нельзя
сериализовать стандартным механизмом структурированных клонирований
(structuredClone), не могут быть сохранены в IndexedDB
через Idb-keyval.
Функции в JavaScript являются объектами, но их внутреннее представление содержит исполняемый код, который не может быть корректно сериализован.
import { set, get } from 'idb-keyval';
function greet() {
console.log('Hello');
}
set('myFunction', greet).catch(console.error); // Ошибка
Почему функции не хранятся:
Альтернатива: хранить строковое представление
функции через toString(), но это требует последующей
eval() для восстановления, что крайне нежелательно по
соображениям безопасности.
Symbol)Символы в JavaScript — уникальные и неизменяемые идентификаторы, используемые для ключей объектов.
const sym = Symbol('id');
set('mySymbol', sym).catch(console.error); // Ошибка
Почему символы не сохраняются:
Symbol.Решение: при необходимости можно хранить описание
символа через String(sym) или использовать обычные строки
вместо символов для ключей данных.
Proxy)Прокси создаются для перехвата операций над объектами, включая чтение, запись, перечисление и вызовы функций.
const target = { name: 'Alice' };
const proxy = new Proxy(target, { get: (obj, prop) => obj[prop] });
set('myProxy', proxy).catch(console.error); // Ошибка
Почему прокси не сохраняются:
traps) и внутреннее поведение прокси.Рекомендация: хранить исходный объект без прокси. При необходимости восстановления логики прокси нужно создавать её заново после извлечения данных.
Помимо функций, символов и прокси, следует учитывать другие типы,
которые не поддерживаются для хранения через
Idb-keyval:
structuredClone — вызов set приведёт
к ошибке.if (typeof value !== 'function' && typeof value !== 'symbol') {
set('key', value);
}
const plainObject = JSON.parse(JSON.stringify(proxy));
set('plainData', plainObject);
Idb-keyval.Эти ограничения определяют, какие данные можно безопасно сохранять и как структурировать объекты для хранения, сохраняя совместимость с библиотекой и целостность данных.