Idb-keyval — это легковесная обёртка над IndexedDB,
предоставляющая асинхронный интерфейс для хранения ключ–значение.
Библиотека упрощает работу с браузерным хранилищем, освобождая от
необходимости писать объёмный код для открытия базы данных, создания
транзакций и обработки ошибок. Основные методы включают:
set(key, value) — сохраняет значение
под указанным ключом. Возвращает Promise.get(key) — получает значение по ключу.
Возвращает Promise, который резолвится значением или
undefined.del(key) — удаляет значение по
ключу.clear() — очищает все записи.keys() — возвращает массив всех
ключей.upd ate(key, updater) — позволяет
обновить существующее значение через функцию.В условиях, когда IndexedDB недоступен (например, в режиме инкогнито
Safari или при ограничениях политики браузера), Idb-keyval
предоставляет возможность мягкой деградации. Основные
моменты:
set, get, del или
clear при недоступном хранилище не выбрасывают исключений
критического уровня, а резолвятся локальными данными либо
undefined.Для реализации корректной деградации используется проверка возможностей IndexedDB при инициализации. Примерная схема работы:
import { createStore, get, se t, del } from 'idb-keyval';
let store;
try {
store = createStore('my-db', 'keyval-store');
} catch (error) {
// IndexedDB недоступен — используем память
const memoryStore = new Map();
store = {
get: key => Promise.resolve(memoryStore.get(key)),
set: (key, value) => { memoryStore.set(key, value); return Promise.resolve(); },
del: key => { memoryStore.delete(key); return Promise.resolve(); },
clear: () => { memoryStore.clear(); return Promise.resolve(); },
};
}
В этом примере код взаимодействует с одним и тем же интерфейсом, вне зависимости от того, доступно IndexedDB или нет. Это минимизирует вероятность ошибок при использовании библиотеки в различных средах.
import { get, set } from 'idb-keyval';
async function saveUserSettings(settings) {
try {
await set('user-settings', settings);
} catch (error) {
console.warn('Хранилище недоступно, настройки будут потеряны после закрытия вкладки.');
}
}
async function loadUserSettings() {
const settings = await get('user-settings');
if (!settings) {
return { theme: 'light', notifications: true };
}
return settings;
}
В этом примере демонстрируется устойчивость приложения к недоступности IndexedDB: операции продолжают работать, а пользователю предоставляются разумные значения по умолчанию при отсутствии сохранённых данных.