IndexedDB является низкоуровневым API для хранения структурированных
данных в браузере, однако его доступность не гарантирована во всех
средах выполнения. Основные причины и аспекты этой недоступности
необходимо учитывать при работе с библиотекой
idb-keyval.
Серверные окружения: В Node.js и других серверных
средах IndexedDB отсутствует, так как это API браузера. Попытка
использовать idb-keyval напрямую в серверной логике
приведет к ошибкам, так как глобальный объект indexedDB не
определён.
Некоторые старые браузеры: Несмотря на широкое распространение IndexedDB, старые версии браузеров могут не предоставлять этого API. Например, Internet Explorer 9 и ниже не поддерживают IndexedDB. Даже в браузерах, где API присутствует, он может быть ограничен в функциональности или иметь нестабильное поведение.
Режим инкогнито и ограниченные политики
безопасности: В Chrome и Safari при работе в приватном режиме
IndexedDB может быть временно недоступен или полностью заблокирован.
Например, в Safari в приватном режиме доступ к IndexedDB возвращает
объект indexedDB, но попытки создания базы данных
выбрасывают ошибку QuotaExceededError.
Перед использованием idb-keyval необходимо убедиться,
что IndexedDB доступен:
import { set, get } from 'idb-keyval';
function isIndexedDBAvailable() {
try {
return typeof indexedDB !== 'undefined';
} catch (e) {
return false;
}
}
if (isIndexedDBAvailable()) {
set('key', 'value');
} else {
console.warn('IndexedDB недоступен в текущем окружении');
}
Ключевой момент: проверка должна включать не только
существование объекта indexedDB, но и возможность создавать
базы данных и транзакции, так как некоторые окружения могут создавать
объект, но блокировать операции с ним.
Даже при прохождении проверки на наличие indexedDB
необходимо обрабатывать ошибки при доступе к базе данных:
async function safeSet(key, value) {
try {
await set(key, value);
} catch (err) {
console.error('Ошибка при работе с IndexedDB:', err);
// Альтернативная стратегия хранения, например, sessionStorage
sessionStorage.setItem(key, JSON.stringify(value));
}
}
Рекомендации:
try/catch при каждой операции с
idb-keyval.Для универсальных приложений (isomorphic/universal) можно динамически
импортировать idb-keyval только если IndexedDB
доступен:
let idb;
if (typeof indexedDB !== 'undefined') {
idb = await import('idb-keyval');
}
Это предотвращает ошибки при запуске кода на сервере или в окружении
без IndexedDB, одновременно сохраняя возможность использования
idb-keyval в поддерживаемых браузерах.
Недоступность IndexedDB может проявляться не только в полном отсутствии API, но и в его ограничениях:
get и
set всегда возвращают промисы. В случае недоступности
IndexedDB промис отклоняется.QuotaExceededError.Недоступность IndexedDB — частая причина сбоев при работе с клиентским хранилищем. Продуманная проверка окружения, обработка ошибок и альтернативные стратегии хранения обеспечивают стабильность приложения при любых условиях.