菜鸟进阶之路:一文讲清JS本地存储方式

91 阅读5分钟

前言

前段时间恰好有一个与浏览器存储相关的小需求,想到了就翻出来了之前的笔记介绍一下关于本地缓存的小知识。

image.png

类型

在本文中,我们将主要讨论JavaScript本地缓存的四种方法:

  • cookie
  • sessionStorage
  • localStorage
  • indexedDB

cookie

Cookie是一种"小型文本文件",某些网站将其存储在用户本地终端上,以识别用户身份。它旨在解决HTTP无状态带来的问题。

作为一段通常不超过 4KB 的小型文本数据,cookie由名称(Name)、值(Value)以及用于控制cookie有效期、安全性和使用范围的几个可选属性组成。

然而,cookie会在每次请求中被发送。如果不使用HTTPS进行加密,其中保存的信息容易被窃取,从而带来安全风险。例如,在一些使用cookie保持登录状态的网站上,如果cookie被盗取,他人可以轻易利用你的cookie冒充你登录网站。

以下是关于cookie常用属性的信息:

  • Expires 用于设置 Cookie 的过期时间
Expires=Wed, 21 Oct 2015 07:28:00 GMT
  • Max-Age 用于设置在 Cookie 失效之前需要经过的秒数(比Expires具有更高的优先级)
Max-Age=604800
  • Domain指定了Cookie可以送达的主机名
  • Path指定了一个URL路径,只有在要请求的资源路径中包含这个路径时才能发送Cookie首部
Path=/docs   # /docs/Web/ 下的资源会携带 Cookie 首部
  • 标记为SecureCookie只能通过经过HTTPS协议加密的请求发送给服务器端

从上述信息可以看出,cookie最初并非为缓存而设计,而是利用了cookie的特性来实现缓存。

以下是关于cookie使用的示例:

document.cookie = '名字=值';

对于cookie的修改,首先需要确保domainpath属性相同,否则任何一个不同都会创建一个新的cookie

Set-Cookie:name=aa; domain=aa.net; path=/  # 服务端设置
document.cookie =name=bb; domain=aa.net; path=/  # 客户端设置

最后,要删除cookie,最常见的方法是设置cookie的过期时间,这样一旦cookie过期,浏览器就会将其删除。

localStorage

HTML5新方法,IE8及以上浏览器都兼容

特点

  • 生命周期:持久化的本地存储,除非主动删除数据,否则数据永远不会过期
  • 存储的信息在同一域中是共享的
  • 当本页操作(新增、修改、删除)了localStorage时,本页面不会触发storage事件,但其他页面会触发storage事件。
  • 大小:5M(取决于浏览器厂商)
  • localStorage本质上是对字符串的读取,存储内容过多会消耗内存空间,导致页面卡顿
  • 受同源策略限制

下面再看看关于localStorage的使用

设置

localStorage.setItem('username', 'cfangxu');

获取

localStorage.getItem('username')

获取键名

localStorage.key(0) //获取第一个键名

删除

localStorage.removeItem('username')

一次性清除所有存储

localStorage.clear()

localStorage也不是完美的,它有两个缺点:

  • 无法像Cookie一样设置过期时间
  • 只能存入字符串,无法直接存储对象
localStorage.setItem('key', {name: 'value'});
console.log(localStorage.getItem('key')); // '[object, Object]'

sessionStorage

sessionStoragelocalStorage使用方法基本一致,唯一不同的是生命周期,一旦页面(会话)关闭,sessionStorage将会删除数据

indexedDB

indexedDB是一种低级API,用于客户端存储大量结构化数据(包括文件/ blobs)。该API使用索引来实现对数据的高性能搜索

虽然Web Storage对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太有用。IndexedDB提供了一个解决方案

优点:

  • 储存量理论上没有上限
  • 所有操作都是异步的,相比LocalStorage同步操作性能更高,尤其是数据量较大时
  • 原生支持存储JS对象
  • 是一个正经的数据库,意味着数据库能够做的事情它都能做

缺点:

  • 操作非常繁琐
  • 有一定的学习门槛

关于indexedDB的使用基本步骤如下:

  • 打开数据库并开始一个事务
  • 创建一个object store
  • 构建一个请求来执行一些数据库操作,如增加或提取数据等。
  • 通过监听正确类型的DOM事件以等待操作完成。
  • 在操作结果上执行一些操作(可以在request对象中找到)

虽然使用indexedDB较为繁琐,但大家可以通过使用Godb.js库进行缓存,最大化降低操作难度

区别

关于cookiesessionStoragelocalStorage三者的区别主要如下:

  • 存储大小:cookie数据大小不能超过4ksessionStoragelocalStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  • 有效时间:localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据; sessionStorage数据在当前浏览器窗口关闭后自动删除; cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
  • 数据与服务器之间的交互方式,cookie的数据会自动传递到服务器,服务器端也可以写cookie到客户端; sessionStoragelocalStorage不会自动发送数据给服务器,仅在本地保存

应用场景

在了解了上述前端缓存方式后,我们可以根据不同场景选择使用:

  • 标记用户和跟踪用户行为的情况,推荐使用cookie
  • 适合长期保存在本地的数据(令牌),推荐使用localStorage
  • 敏感账号一次性登录,推荐使用sessionStorage
  • 存储大量数据的情况、在线文档(富文本编辑器)保存编辑历史的情况,推荐使用indexedDB

结语

至此,JS本地存储方式就已经介绍完了。这篇内容与其说是文章更像是一篇笔记。

欢迎大家留言讨论,不足之处也烦请批评指正。