Idb-keyval — это лёгкая обёртка над IndexedDB, обеспечивающая удобное хранение пар ключ-значение в браузере. Она упрощает задачи по кэшированию данных, их локальному хранению и последующей синхронизации с сервером. Библиотека ориентирована на асинхронную работу и поддерживает промисы, что делает её естественным выбором для современных приложений на JavaScript.
import { get, set, del, keys } from 'idb-keyval';
Idb-keyval позволяет сохранять любые сериализуемые объекты. Простейший пример:
await set('user', { id: 1, name: 'Иван', lastSync: Date.now() });
const user = await get('user');
console.log(user);
Ключевые моменты:
structuredClone, может
быть сохранён.Для синхронизации локального состояния с сервером часто используют стратегию “локальная очередь изменений”:
Пример реализации локальной очереди:
async function queueUpdate(key, value) {
const queue = (await get('syncQueue')) || [];
queue.push({ key, value, timestamp: Date.now() });
await set('syncQueue', queue);
}
async function processQueue() {
const queue = (await get('syncQueue')) || [];
for (const item of queue) {
try {
await fetch('/api/upd ate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: item.key, value: item.value })
});
} catch (err) {
console.error('Ошибка синхронизации', err);
continue;
}
}
await se t('syncQueue', []);
}
Ключевые аспекты:
Чтобы избежать конфликтов между серверной и локальной версией данных, часто используют timestamp или versioning:
await set('user', { id: 1, name: 'Иван', version: 3 });
При синхронизации сервер проверяет:
debounceЧтобы минимизировать количество сетевых запросов при частых изменениях, используют отложенную синхронизацию:
let timeout;
function scheduleSync() {
clearTimeout(timeout);
timeout = setTimeout(() => processQueue(), 2000);
}
Каждое новое изменение сбрасывает таймер и откладывает синхронизацию на 2 секунды, что уменьшает нагрузку на сервер.
При необходимости синхронизировать большие объёмы:
keys() для перебора всех ключей
IndexedDB.const allKeys = await keys();
for (const key of allKeys) {
const value = await get(key);
// обработка value
}
Idb-keyval поддерживает транзакции через внутренние механизмы IndexedDB. Для критичных операций рекомендуется:
Для оффлайн-приложений Idb-keyval может работать в связке с Service Worker:
self.addEventListener('sync', event => {
if (event.tag === 'sync-data') {
event.waitUntil(processQueue());
}
});
get/set.Idb-keyval обеспечивает простой, но мощный инструмент для хранения данных локально и синхронизации с сервером, позволяя создавать устойчивые к сетевым сбоям приложения, управлять версиями и реализовывать сложные сценарии оффлайн-работы без глубокой работы с IndexedDB напрямую.