localStorage是HTML5提供的一种在客户端存储数据的机制,可以将数据存储在浏览器中,供同一域名下的所有页面访问。与传统的cookie相比,localStorage有以下优点:
- 可以存储更多的数据(通常5-10MB)。
- 不会随HTTP请求发送到服务器,因此可以减少网络流量。
- 可以通过JavaScript API直接访问,使用更加方便。
使用localStorage非常简单,可以通过以下代码将数据存储到localStorage中:
localStorage.setItem('key', 'value');
其中,key是一个字符串类型的键值,value可以是任意类型的值,包括字符串、数字、对象等。可以通过以下代码获取存储在localStorage中的数据:
var value = localStorage.getItem('key');
如果需要删除某个键值对,可以使用以下代码:
localStorage.removeItem('key');
需要注意的是,localStorage中存储的数据是永久性的,除非通过代码或用户手动删除,否则会一直存在于浏览器中。因此,在使用localStorage时需要注意避免存储敏感信息,以及及时清理不再需要的数据,以避免占用过多的磁盘空间。
前面介绍Deno时说过,它实现了大部分的浏览器API,当然包括localStorage。这点有的程序员诟病,我却是比较喜欢的。我们《一起学Deno》中第一阶段就是利用localStorage缓存的数据。
但在Deno中,我们可以使用多大的空间呢?
以下是个测试:
const aa = new Array(5 * 1024 * 1024).fill("a").join("");
localStorage.setItem("aa1", aa);
到Deno的缓存目录/Users/jw/Library/Caches/deno/location_data找到缓存文件:
我注意到这个大小有些不太对,在老版Deno里是整整的5.0M的,现在是1.34.3。
5M是临界点,超过后直接就报错了。
const aa = new Array(5 * 1024 * 1024 + 1).fill("a").join("");
localStorage.setItem("aa1", aa);
报错信息:
error: Uncaught QuotaExceededError: Exceeded maximum storage size
localStorage.setItem("aa1", aa);
^
at Proxy.setItem (internal:ext/webstorage/01_webstorage.js:60:11)
at file:///Users/jw/wk/fresh/deno_thingjsx_site/main.ts:2:14
那么是不是只能写入5M呢?也不是,可能是Deno的一个Bug,也可能是故意这么设计的,不重要。
手动把缓存文件删除后,执行以下代码:
const aa = new Array(5 * 1024 * 1024).fill("a").join("");
localStorage.setItem("aa1", aa);
localStorage.setItem("aa2", aa);
成功了,再看缓存文件:
但是当我试图再写入一点点时就报错了:
const aa = new Array(5 * 1024 * 1024).fill("a").join("");
localStorage.setItem("aa1", aa);
localStorage.setItem("aa2", aa);
localStorage.setItem("aa3", "a");
报错信息与前面是一样的:
error: Uncaught QuotaExceededError: Exceeded maximum storage size
localStorage.setItem("aa3", '1');
不过虽然报错了,但是缓存文件还是写入成功了:
另外,测试发现,localStorage.clear();有时候没有生效。