idb-keyval — это легковесная обертка над IndexedDB, предназначенная для упрощения работы с ключ-значение парами в браузере. Она идеально подходит для простого хранения небольших объемов данных, таких как настройки пользователя, кэширование небольших объектов или временные данные. Однако есть несколько ключевых ограничений, которые могут потребовать перехода на idb — более мощную библиотеку для работы с IndexedDB.
idb-keyval работает исключительно с одноуровневой структурой “ключ-значение”. Это означает, что все объекты хранятся как отдельные записи без поддержки сложных отношений между ними. Если требуется:
то idb-keyval окажется недостаточной. В таких случаях idb предоставляет полноценную работу с объектными хранилищами (object stores) и индексами.
idb-keyval не поддерживает сложные транзакции. Все операции выполняются независимо, и нельзя объединить несколько действий в атомарную транзакцию. Это может стать критическим, если нужно:
idb позволяет создавать транзакции с множеством хранилищ и гарантирует, что изменения будут выполнены атомарно.
idb-keyval хорошо подходит для хранения небольших объемов данных, но при увеличении количества записей и необходимости частых обновлений производительность может снизиться. При необходимости работы с десятками тысяч записей или с большими объектами стоит использовать idb, который позволяет:
Предположим, есть веб-приложение, которое хранит пользовательские заметки. Вначале каждая заметка может быть сохранена как отдельный объект в idb-keyval. Но если появляются требования:
то idb-keyval уже не справляется. В таких случаях переход на idb обеспечивает:
notes,
tags, categories),import { openDB } from 'idb';
const db = await openDB('notes-db', 1, {
upgrade(db) {
if (!db.objectStoreNames.contains('notes')) {
const notesStore = db.createObjectStore('notes', { keyPath: 'id', autoIncrement: true });
notesStore.createIndex('by-date', 'date');
notesStore.createIndex('by-tag', 'tag');
}
}
});
const note = { title: 'Новая заметка', content: 'Содержимое', date: Date.now(), tag: 'work' };
await db.add('notes', note);
const notesByTag = await db.getAllFromIndex('notes', 'by-tag', 'work');
const tx = db.transaction('notes', 'readwrite');
const store = tx.objectStore('notes');
const allNotes = await store.getAll();
allNotes.forEach(n => {
if (n.tag === 'work') n.status = 'done';
store.put(n);
});
await tx.done;
idb-keyval подходит для быстрых, простых решений, но как только появляется потребность в:
необходимо переходить на idb. Этот шаг открывает доступ к полному функционалу IndexedDB, сохраняя при этом относительно простой и понятный интерфейс работы с базой.
Использование idb позволяет создавать гибкие и надежные клиентские хранилища данных, удовлетворяющие растущим требованиям современных веб-приложений.