使用IndexedDB管理缓存
如果你正在开发需要大量使用本地缓存的应用,如图形编辑类应用、文件管理类应用等,低容量的 localStorage 已经无法满足开发需求,此时你可以使用 IndexedDB 配合 alova 进行大容量的本地缓存管理。
这一功能主要得益于 alova 的 受控缓存 功能,它可以实现自定义的缓存管理,我们来看看实践步骤。
我们以自定义管理大图片数据为例。
创建 IndexedDB 实例
首先创建一个 IndexedDB 实例用于操作本地缓存,并导出缓存操作的函数。
const dbVersion = 1;
let dbInstance;
const request = window.indexedDB.open('MyTestDatabase', dbVersion);
request.onupgradeneeded = ({ target }) => {
dbInstance = target.result;
const imgStore = dbInstance.createObjectStore('images', {
autoIncrement: true
});
imgStore.createIndex('fileName', 'fileName', {
unique: true
});
};
request.onerror = () => {
throw new Error('Database open fail');
};
request.onsuccess = ({ target }) => {
dbInstance = target.result;
};
// 新增数据到IndexedDB
export const addImage2Cache = async (fileName, data) => {
const tx = dbInstance.transaction(['images'], 'readwrite');
const request = tx.objectStore('images').add({
fileName,
data
});
return new Promise((resolve, reject) => {
request.onerror = () => {
reject('data add fail');
};
request.onsuccess = ({ result }) => {
resolve(result);
};
});
};
// 根据fileName获取文件数据
export const getImageFromCache = async fileName => {
const tx = dbInstance.transaction(['images']);
const request = tx.objectStore('images').index('fileName').get(fileName);
return new Promise((resolve, reject) => {
request.onerror = () => {
reject('data add fail');
};
request.onsuccess = ({ target }) => {
resolve(target.result);
};
});
};