Cookies
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。
通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。
Cookie 曾一度用于客户端数据的存储,因当时并没有其他合适的存储办法而作为唯一的存储手段,但现在推荐使用现代存储 API。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。
特点
- cookie的大小受限制,cookie大小被限制在4KB。
- cookie也可以设置过期的时间,默认是会话结束的时候,当时间到期自动销毁。
- 一个域名下存放的cookie的个数是有限制的,不同的浏览器存放的个数不一样,一般为20个。
- 用户每请求一次服务器数据,cookie会随着这些请求发送到服务器。
- cookie数据始终在同源的http请求中携带(即使不需要),这也是Cookie不能太大的重要原因
Web Storage
Web Storage API - Web API 接口参考 | MDN
这是一种持久化的存储方式,也就是说如果不手动清除,数据就永远不会过期。它也是采用Key - Value的方式存储数据,底层数据接口是sqlite,按域名将数据分别保存到对应数据库文件里。它能保存更大的数据。
特点
- 保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据。
- 大小为5M左右。
- 仅在客户端使用,不和服务端进行通信。
- 存储的信息在同一域中是共享的。
- localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。
IndexedDB
IndexedDB - Web API 接口参考 | MDN
IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。
整体体验下来原生的API比较繁琐,localForage 这个库简化了流程,且使用 localStorage 兼容无 indexedDB 功能的浏览器,整体使用比较nice
容量:初始化为 50MB,后续还需要使用的话经过用户同意还可以扩容。
思考:localStorage如果存储内容多的话会消耗内存空间,会导致页面变卡。那么 IndexedDB 存储量过多的话会导致页面变卡吗?
不有太大影响,因为 IndexedDB 的读取和存储都是异步的。