Summary
Async key-value store — large structured data, offline cache, not for hot reactive state. Version migrations explicit (onupgradeneeded); blocking opens freeze UI. Index design for query patterns; batch transactions. Quota eviction under storage pressure — handle QuotaExceededError.
Code example
function openDb() {
return new Promise((resolve, reject) => {
const req = indexedDB.open('app-cache', 2);
req.onupgradeneeded = () => {
const db = req.result;
if (!db.objectStoreNames.contains('posts')) {
db.createObjectStore('posts', { keyPath: 'id' });
}
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
Key points
- Async key-value store — large structured data, offline cache, not for hot reactive state.
- Version migrations explicit (
onupgradeneeded); blocking opens freeze UI. - Index design for query patterns; batch transactions.
- Quota eviction under storage pressure — handle
QuotaExceededError.