Idb-keyval — это лёгкая библиотека для работы с
IndexedDB в браузере. Она предоставляет упрощённый интерфейс для
хранения, извлечения и удаления данных в виде ключ-значение, полностью
абстрагируя сложности низкоуровневого API IndexedDB. Основная идея
заключается в том, чтобы превратить асинхронное хранилище в максимально
простой инструмент для сохранения пользовательских настроек.
Базовые операции включают: set, get,
del, clear и keys. Все функции
возвращают промисы, что позволяет легко интегрировать их с современными
асинхронными конструкциями, такими как async/await.
import { set, get, del, clear, keys } from 'idb-keyval';
// Сохранение значения
await set('theme', 'dark');
// Получение значения
const theme = await get('theme');
// Удаление значения
await del('theme');
// Очистка всех данных
await clear();
// Получение всех ключей
const allKeys = await keys();
Для пользовательских настроек важно структурировать данные так, чтобы легко было управлять различными типами настроек: визуальные (цветовая схема, размер шрифта), функциональные (уведомления, автозаполнение), системные (язык, регион). Рекомендуется использовать единый объект или отдельные ключи для каждой категории настроек.
Пример хранения сложного объекта настроек:
const userSettings = {
theme: 'light',
notifications: {
email: true,
push: false
},
language: 'ru',
fontSize: 16
};
await set('userSettings', userSettings);
// Получение всех настроек
const settings = await get('userSettings');
console.log(settings.language); // 'ru'
Использование одного ключа для всего объекта позволяет загружать и сохранять все настройки целиком, упрощая синхронизацию и управление версиями настроек.
Если необходимо управлять отдельными настройками независимо, можно сохранять каждую настройку как отдельный ключ. Это удобно, если изменения происходят редко и не требуется загружать весь объект:
await set('theme', 'dark');
await set('fontSize', 18);
const theme = await get('theme'); // 'dark'
const fontSize = await get('fontSize'); // 18
Такой подход снижает количество операций чтения/записи при изменении одной настройки, но требует аккуратного управления ключами.
Все функции Idb-keyval возвращают промисы, поэтому использование
async/await — оптимальный способ работы:
try {
await set('language', 'en');
const lang = await get('language');
console.log(lang); // 'en'
} catch (error) {
console.error('Ошибка при работе с IndexedDB:', error);
}
Важно обрабатывать ошибки, так как доступ к IndexedDB может быть заблокирован настройками браузера или ограничениями безопасности.
Idb-keyval позволяет создавать собственные хранилища, если требуется использовать несколько баз данных или разных объектов внутри одной базы:
import { Store, set, get } from 'idb-keyval';
const settingsStore = new Store('settingsDB', 'settingsStore');
await set('theme', 'dark', settingsStore);
const theme = await get('theme', settingsStore);
Это полезно для разделения пользовательских данных по категориям, предотвращения конфликтов с другими приложениями или модулями.
В React или Vue можно интегрировать Idb-keyval для сохранения состояния пользователя между сессиями:
import { useEffect, useState } from 'react';
import { get, set } from 'idb-keyval';
function useUserSettings() {
const [settings, setSettings] = useState({ theme: 'light', fontSize: 14 });
useEffect(() => {
get('userSettings').then(storedSettings => {
if (storedSettings) setSettings(storedSettings);
});
}, []);
const updateSettings = async (newSettings) => {
const upd ated = { ...settings, ...newSettings };
setSettings(updated);
await se t('userSettings', updated);
};
return [settings, updateSettings];
}
Такой подход позволяет автоматически загружать сохранённые настройки при монтировании компонента и обновлять их при изменении.
Promise и
async/await.Idb-keyval превращает IndexedDB в доступное и удобное решение для сохранения пользовательских настроек, позволяя создавать гибкие и устойчивые веб-приложения без погружения в низкоуровневый API.