浏览器原生 · 零依赖 · 类型安全

浏览器 持久化

通用 IndexedDB 存储方案:任何数据类型、强大查询、自动清理。Promise 异步 API,与 async/await 无缝集成。

await storage.query(...)
-- 操作
-- 参数
-- 结果
0 运行时依赖
90 测试用例
any 支持任意数据类型
100% TypeScript 泛型

为什么是 IndexedDB Storage

IndexedDB 的强大,不该难用。

把原生 IndexedDB 的样板代码封装掉,留下干净的 Promise API 与类型安全。

高级查询

where 条件、多字段排序、自定义过滤、复杂范围查询。

storage.query({
  where: { field: 'age', operator: 'between', value: [25, 35] },
})

自动清理

基于容量或年龄的自动保留机制,定期清理过期数据。

{
  maxRecords: 1000,
  retentionTime: 7 * 24 * 60 * 60 * 1000,
  cleanupInterval: 60 * 60 * 1000,
}

单例模式

dbName + storeName 自动复用连接,相同配置不再重复初始化。

// 相同配置 → 复用同一实例
new IndexedDBStorage({ dbName: 'app', storeName: 'users' }, cfg)
new IndexedDBStorage({ dbName: 'app', storeName: 'users' }, cfg)

用法

从保存到查询,五步走。

初始化 → 保存 → 查询 → 更新 → 删除,全是 Promise。

import { IndexedDBStorage } from '@chaeco/indexed-db-storage';

const storage = new IndexedDBStorage<User>(
  { dbName: 'my-app', storeName: 'users' },
  { storeName: 'users', keyPath: 'id', autoIncrement: true },
);

await storage.init();

await storage.save({ name: 'John Doe', email: 'john@example.com' });
const users = await storage.query({ limit: 10 });
const user = await storage.get(1);
await storage.update({ id: 1, name: 'Jane Doe' });
await storage.delete(1);
// 按索引查询
const products = await storage.query({
  indexName: 'category',
  range: IDBKeyRange.only('electronics'),
  limit: 20,
});

// 范围查询
const expensive = await storage.query({
  indexName: 'price',
  range: IDBKeyRange.lowerBound(1000),
  limit: 10,
});

高级查询

一套操作符,覆盖常见需求。

等值、比较、范围、字符串匹配——全部内置。

操作符说明示例
eq等值{ field: 'age', operator: 'eq', value: 25 }
gt / gte / lt / lte比较{ operator: 'gt', value: 30 }
between范围{ operator: 'between', value: [25, 35] }
contains包含{ field: 'name', operator: 'contains', value: 'hn' }
startsWith前缀{ field: 'name', operator: 'startsWith', value: 'Jo' }

开始使用

浏览器数据,就该这么存。

$ npm install github:chaeco/indexed-db-storage

浏览器 · 零依赖 · 全 TypeScript · MIT