localstorage和sessionstorage如果存满会怎样?
关于浏览器的存储知识详细见我写的文章https://blog.youkuaiyun.com/fageaaa/article/details/145643306
1.示例
如果localstorage和sessionstorage存储容量溢出了怎么办?我们可以使用一个测试网站来看看:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Storage Limit Test</title>
</head>
<body>
<script>
function testStorageLimit(storageType) {
try {
const storage = window[storageType];
const maxStorageSize = 5 * 1024 * 1024; // 5MB
const testData = 'a'.repeat(maxStorageSize); // 创建一个大小为5MB的测试数据
storage.setItem('testData', testData);
console.log(`${storageType} - Data stored successfully.`);
// 尝试读取存储的数据
const retrievedData = storage.getItem('testData');
console.log(`${storageType} - Retrieved data length:`, retrievedData.length);
} catch (error) {
console.error(`${storageType} - Storage limit exceeded:`, error);
}
}
// 测试 localStorage 存储空间限额
console.log('Testing localStorage:');
testStorageLimit('localStorage');
// 测试 sessionStorage 存储空间限额
console.log('\nTesting sessionStorage:');
testStorageLimit('sessionStorage');
</script>
</body>
</html>

当存储空间已满,尝试通过setItem()方法添加更多数据时,浏览器会抛出一个QuotaExceededError异常。这意味着应用程序无法再向localStorage或sessionStorage中写入任何新数据。
2.最后一次溢出的字符串是会存储到最大容量停止还是不会存储?
最后一次尝试存储超出容量的字符串,浏览器会拒绝存储,并且不会将该字符串存储到 localStorage 或 sessionStorage 中。 在存储空间达到限额后,任何进一步的存储操作都会失败,浏览器不会尝试将超出容量的数据存储到客户端存储中。
下面是一个简单的网页测试,点击按钮会尝试向 localStorage 存储增加 500KB 的数据。测试结果将会显示存储是否成功,以及当前的存储大小。(注意:如果使用相同的键(key)向 localStorage 或 sessionStorage 存储数据,新数据会覆盖掉旧数据。)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Storage Test</title>
<script>
function updateStorage() {
try {
const dataSize = 500 * 1024; // 500KB
const existingData = localStorage.getItem('testData') || '';
const newData = 'a'.repeat(dataSize);
const totalSize = (existingData.length + newData.length) / 1024; // 转换为KB
localStorage.setItem('testData', existingData + newData);
console.log(`存储成功,总共存储了 ${totalSize} KB 的数据。`);
document.getElementById(
'result',
).innerText += `\n存储成功,总共存储了 ${totalSize} KB 的数据。`;
} catch (error) {
console.error('存储失败:', error);
document.getElementById('result').innerText += '\n存储失败: 存储限额已满。';
}
}
</script>
</head>
<body>
<button onclick="updateStorage()">增加500KB的存储</button>
<div id="result"></div>
</body>
</html>


3.总结
对于存储限制,通常情况下,每个域名的localStorage和sessionStorage的总存储空间大约为5MB至10MB,具体大小可能因浏览器而异。当接近或达到这个存储限制时,会发生以下情况:
- 无法再添加新数据: 当存储空间已满,尝试通过setItem()方法添加更多数据时,浏览器会抛出一个QuotaExceededError异常。这意味着应用程序无法再向localStorage或sessionStorage中写入任何新数据。
- 不会自动覆盖已有数据: 即使存储空间满了,已存储的数据也不会被自动替换或删除。浏览器不会为了腾出空间而清除旧数据,而是直接拒绝新增数据的请求。
4.如何给localStorage扩容?
localStorage的容量是有限制的,通常是由浏览器设定的,并且不同的浏览器可能具有不同的限制。一般来说,这个限制大约在5MB左右。
由于这些限制是由浏览器本身设定的,因此作为开发者,你无法直接“扩容” localStorage。但是,你可以采取一些策略来更有效地使用 localStorage,或者寻找替代方案来存储更多的数据。
4.1 优化数据存储
- 在将数据保存到 localStorage 之前,先对其进行压缩(例如,使用 pako 或类似的库进行gzip压缩)。
- 如果可能的话,尝试减少存储的数据量。例如,只保存必要的信息,而不是整个对象或数组。
- 定期清理不再需要的数据。
4.2 使用IndexedDB
IndexedDB 是一种更强大的浏览器内数据库,它提供了更大的存储容量和更复杂的查询功能。虽然它的API比 localStorage 更复杂一些,但它是一个很好的替代方案,特别是当你需要存储大量数据时。
4.3 使用Web SQL(已弃用,但某些环境仍可用)
Web SQL 是一种已经在某些浏览器中实现的数据库技术。然而,它已经被W3C弃用,因此不建议用于新的开发项目。但如果你正在维护一个已经使用Web SQL的旧项目,并且需要在特定环境中增加存储容量,那么可以考虑继续使用它。
4.4 使用服务器端存储
如果你的应用需要存储大量数据,并且客户端存储不是最佳选择(例如,出于安全或隐私原因),那么可以考虑使用服务器端存储。通过API调用将数据发送到服务器,并在需要时从服务器检索数据。
4.5 分割数据
如果你确实需要在客户端存储大量数据,并且无法使用IndexedDB或其他替代方案,那么可以尝试将数据分割成多个部分,并分别存储在 localStorage 中。然后,你可以编写逻辑来按需检索和组合这些数据部分。
4.6 提示用户
当 localStorage 空间不足时,向用户显示一条友好的消息,解释为什么需要更多的存储空间,并请求他们清理浏览器缓存或执行其他操作来释放空间。
4.7 第三方库处理
- localforage
- idb-keyval

1833

被折叠的 条评论
为什么被折叠?



