Библиотека idb-keyval предоставляет удобный интерфейс для работы с IndexedDB, упрощая задачи сохранения и извлечения ключ-значение данных. В основе лежит асинхронный API с промисами, что позволяет писать чистый и читаемый код без лишней сложности, связанной с низкоуровневым IndexedDB.
import { set, get, del } from 'idb-keyval';
// Сохранение значения
await set('username', 'Ivan');
// Получение значения
const name = await get('username');
console.log(name); // 'Ivan'
// Удаление значения
await del('username');
Ключевое преимущество idb-keyval — простота API: операции
set, get, del, clear
и keys покрывают большинство типичных сценариев без
необходимости ручного управления транзакциями.
Использование IndexedDB в iframe накладывает специфические ограничения:
// iframe с domain-b.example.com
import { set, get } from 'idb-keyval';
await set('token', 'abc123'); // работает только внутри этого origin
const token = await get('token'); // null, если origin отличается от основного
Особенности sandbox-режима Атрибут
sandbox у iframe может полностью запретить доступ к
IndexedDB. Даже при allow-same-origin иногда возникают
ограничения на сохранение больших объектов или использование
транзакций.
Проблемы с кэшированием и private mode В
браузерах вроде Safari или Firefox при использовании iframe в режиме
приватного просмотра доступ к IndexedDB может быть ограничен или
временно недоступен, что ведет к выбрасыванию ошибок при вызове
set или get.
При попытке доступа к базе данных из кросс-доменных скриптов появляются следующие ограничения:
idb-keyval на example.com и
sub.example.com будут храниться в разных базах.postMessage.// Отправка запроса из iframe к родителю
window.parent.postMessage({ type: 'getData', key: 'username' }, '*');
// Родитель отвечает
window.addEventListener('message', async (event) => {
if(event.data.type === 'getData') {
const value = await get(event.data.key);
event.source.postMessage({ key: event.data.key, value }, event.origin);
}
});
QuotaExceededError.idb-keyval оборачивает все операции в промисы, поэтому обработка ошибок становится критичной в ограниченных средах:
try {
await set('settings', { theme: 'dark' });
} catch (err) {
if (err.name === 'QuotaExceededError') {
console.warn('Недостаточно места в хранилище');
} else {
console.error('Ошибка IndexedDB:', err);
}
}
Особенно важно учитывать, что в iframe с кросс-доменом ошибки могут появляться не на момент записи, а при первой попытке открыть базу данных.
const isIDBAvailable = (() => {
try {
return 'indexedDB' in window;
} catch {
return false;
}
})();
QuotaExceededError.postMessage.