Idb-keyval — это минималистичная обертка для IndexedDB,
которая упрощает работу с хранилищем ключ-значение в браузере. Она
идеально подходит для хранения небольших данных, но при работе с
вложенными структурами необходимо учитывать ряд
особенностей и ограничений.
В Idb-keyval ключи и значения могут быть любыми,
которые поддерживает IndexedDB, включая строки, числа, массивы
и объекты. Однако, при вложенных структурах важно помнить о
следующем:
Глубина вложенности и сериализация IndexedDB использует внутреннюю сериализацию структур через structured clone algorithm. Это означает, что объекты могут быть вложенными, но:
set() приведет к ошибке.Map,
Set, WeakMap, WeakSet,
Error и некоторые DOM-элементы, не поддерживаются.import { set } from 'idb-keyval';
const nestedData = {
user: {
name: 'Alice',
preferences: {
theme: 'dark',
notifications: true
}
}
};
set('profile', nestedData)
.then(() => console.log('Данные сохранены'));
В этом примере объект с глубиной вложенности 2 сохраняется без проблем. Если же добавить в объект функцию или ссылку на DOM-элемент, сохранение завершится с ошибкой.
Изменение вложенных объектов При работе с
вложенными структурами необходимо помнить, что Idb-keyval
не поддерживает частичное обновление вложенных полей.
Любое изменение требует полного перезаписывания объекта:
import { get, set } from 'idb-keyval';
async function updateTheme(newTheme) {
const profile = await get('profile');
profile.user.preferences.theme = newTheme;
await set('profile', profile);
}
updateTheme('light');
Попытка напрямую изменить вложенный объект в IndexedDB без полной перезаписи невозможна, так как библиотека оперирует только целыми значениями.
Массивы и объекты внутри массивов
Idb-keyval корректно сохраняет массивы и объекты внутри
массивов. Можно использовать глубокие массивы и массивы объектов, но
следует избегать очень больших структур без разбивки на отдельные ключи.
Например:
const tasks = [
{ id: 1, title: 'Написать статью', done: false },
{ id: 2, title: 'Прочитать документацию', done: true }
];
set('tasks', tasks);
Для массивов длиной несколько тысяч элементов лучше рассмотреть хранение каждого элемента под отдельным ключом, чтобы снизить нагрузку на IndexedDB.
Ограничения производительности
get() и set().Idb-keyval с другими подходами хранения (например, хранение
индексов отдельно).Копирование и клонирование объектов Поскольку
Idb-keyval использует алгоритм клонирования,
изменения в оригинальном объекте после вызова set()
не повлияют на хранимое значение. Это важно учитывать при
работе с вложенными структурами, чтобы не создавать неожиданных
рассинхронизаций:
const original = { settings: { volume: 80 } };
set('settings', original);
original.settings.volume = 100; // это не изменит сохраненные данныеРекомендации по проектированию вложенных данных
Эти правила помогают создавать стабильные и эффективные
хранилища с использованием Idb-keyval, минимизируя
проблемы при работе с вложенными структурами и обеспечивая предсказуемое
поведение при сохранении и извлечении данных.