悠悠楠杉
网站页面
在现代Web开发中,本地数据存储是提升用户体验的关键技术之一。相较于localStorage和sessionStorage的简单键值存储,IndexedDB提供了更强大的本地数据库能力,支持结构化数据、事务操作和大容量存储(通常可达数百MB)。本文将深入解析IndexedDB的核心用法,带你从零实现一个完整的本地缓存方案。
IndexedDB是一个基于事务的NoSQL数据库,核心特点包括:
- 异步操作:所有API均通过事件回调或Promise返回结果,避免阻塞主线程。
- 对象仓库(Object Store):类似SQL中的表,用于存储结构化数据。
- 索引(Index):支持通过非主键字段快速查询数据。
使用indexedDB.open()方法初始化数据库,若不存在则会自动创建:
const request = indexedDB.open('MyDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建对象仓库(类似表)
const store = db.createObjectStore('users', { keyPath: 'id' });
// 创建索引
store.createIndex('nameIdx', 'name', { unique: false });
};
request.onsuccess = () => {
console.log('数据库打开成功');
};const transaction = db.transaction('users', 'readwrite');
const store = transaction.objectStore('users');
store.add({ id: 1, name: 'Alice', age: 25 });const request = store.get(1);
request.onsuccess = () => {
console.log(request.result); // { id: 1, name: 'Alice', age: 25 }
};put()方法覆盖原有记录。store.put({ id: 1, name: 'Alice', age: 26 });store.delete(1);场景:分页查询用户列表
结合索引和游标(Cursor)实现高效分页:
const index = store.index('nameIdx');
const request = index.openCursor();
let page = 1, pageSize = 5;
request.onsuccess = (event) => {
const cursor = event.target.result;
if (cursor && page === 1) {
console.log('当前页数据:', cursor.value);
if (--pageSize === 0) {
cursor.continue(); // 跳转到下一页
page++;
pageSize = 5;
}
}
};onerror事件处理异常。onupgradeneeded中管理数据库结构变更。IndexedDB为前端提供了接近原生应用的存储能力,适合缓存复杂数据(如用户配置、离线应用数据)。掌握其核心API后,可结合Service Worker进一步构建离线优先的PWA应用。