此文章发布于6个月前,部分信息可能已经过时,请自行斟酌确认。
当使用 localStorage 时,浏览器对每个域的存储限制通常是 5MB 左右(不同浏览器可能略有差异)。
当超过限制时,会抛出 QuotaExceededError 错误。
突破 5MB 限制的替代方案
1、使用 IndexedDB
IndexedDB 是浏览器内置的异步数据库,存储容量通常为 250MB 以上(具体取决于浏览器和用户设置)。
const request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('dataStore', { keyPath: 'id' });
};
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction('dataStore', 'readwrite');
const store = transaction.objectStore('dataStore');
// 存储数据
store.put({ id: 'largeData', value: largeData });
};2. 使用 Web Storage API 的扩展(如 localForage)👍推荐
localForage是一个封装了IndexedDB、WebSQL和localStorage的库,自动选择最佳存储方式:- 中文:https://localforage.docschina.org 英文:https://localforage.github.io/localForage
引用
引用非常简单,只需要引入 js 文件即可直接使用
<script src="localforage/dist/localforage.js"></script>
<script>localforage.getItem('something', myCallback);</script>存储
// 通过 localForage 存储大数据
localforage.setItem('largeData', bigData).then(() => {
console.log('Data saved!');
});
// localForage 同样支持回调函数
localforage.setItem('key', 'value', doSomethingElse);获取
localforage.getItem('somekey').then(function(value) {
// 当离线仓库中的值被载入时,此处代码运行
console.log(value);
}).catch(function(err) {
// 当出错时,此处代码运行
console.log(err);
});
// 回调版本:
localforage.getItem('somekey', function(err, value) {
// 当离线仓库中的值被载入时,此处代码运行
console.log(value);
});移除
localforage.removeItem('somekey').then(function() {
// 当值被移除后,此处代码运行
console.log('Key is cleared!');
}).catch(function(err) {
// 当出错时,此处代码运行
console.log(err);
});3、其它方案
- 数据压缩
- 清理不必要的数据
- 分片存储(Sharding)
- 利用浏览器缓存(Cache API)
- 终极方案:服务端存储