IndexedDB — это встроенная в браузеры асинхронная база данных для хранения структурированных данных. Она позволяет хранить большие объёмы информации на стороне клиента, включая объекты, массивы и бинарные данные (например, изображения или файлы). Основные характеристики IndexedDB:
Работа с IndexedDB напрямую требует написания большого объёма кода для открытия базы, создания хранилищ объектов, индексов и управления транзакциями. Ошибки в обработке событий или транзакций легко приводят к нестабильной работе приложения.
Обёртка над IndexedDB, такая как idb-keyval, упрощает
взаимодействие с базой, предоставляя интерфейс, похожий на
Map или локальное хранилище (localStorage), но с преимуществами
IndexedDB:
idb-keyval подходит для сценариев, когда нужно быстро
хранить и извлекать небольшие объёмы данных: настройки пользователя,
кэшированные ответы API, временные данные между сессиями.
Для использования idb-keyval достаточно установить пакет
через npm:
npm install idb-keyval
Или подключить через CDN:
<script type="module">
import { get, set, del, clear, keys } from 'https://cdn.jsdelivr.net/npm/idb-keyval@6/dist/idb-keyval.mjs';
</script>
После подключения становятся доступны основные методы работы с базой.
set(key, value)Сохраняет значение по ключу. Возвращает промис, который резолвится после успешной записи.
import { set } from 'idb-keyval';
set('username', 'alice').then(() => {
console.log('Данные сохранены');
});
get(key)Получает значение по ключу. Возвращает промис с результатом.
import { get } from 'idb-keyval';
get('username').then(value => {
console.log(value); // 'alice'
});
del(key)Удаляет запись по ключу.
import { del } from 'idb-keyval';
del('username').then(() => {
console.log('Данные удалены');
});
clear()Удаляет все записи из хранилища.
import { clear } from 'idb-keyval';
clear().then(() => {
console.log('Все данные очищены');
});
keys()Возвращает массив всех ключей в хранилище.
import { keys } from 'idb-keyval';
keys().then(allKeys => {
console.log(allKeys); // ['username', 'settings']
});
По умолчанию idb-keyval использует базу
keyval-store и хранилище keyval. Можно
создавать свои базы и хранилища для организации данных:
import { Store, set, get } from 'idb-keyval';
const customStore = new Store('my-database', 'my-store');
set('theme', 'dark', customStore);
get('theme', customStore).then(console.log);
Это удобно для разделения данных по типам или модулям приложения.
Все методы idb-keyval возвращают промисы, поэтому для
обработки ошибок можно использовать .catch или
async/await с try/catch:
import { set, get } from 'idb-keyval';
async function saveSettings() {
try {
await set('volume', 80);
const volume = await get('volume');
console.log(volume);
} catch (error) {
console.error('Ошибка работы с IndexedDB', error);
}
}
Асинхронная модель позволяет писать код линейно, без вложенных обработчиков событий, что делает его более понятным и поддерживаемым.
idb-keyval перед чистым IndexedDBidb-keyval идеально подходит там, где нужна
надежная, асинхронная, но простая база данных на
стороне клиента без необходимости писать громоздкий код на чистом
IndexedDB.