web聊天功能聊天记录的存储方案

1,079 阅读3分钟

结论:使用浏览器数据库indexDB存储,推荐使用第三方库:localForage

indexDB介绍

特性cookielocalStoragesessionStorageindexedDB
数据生命周期一般由服务器生成,可以设置过期时间;前端采用和js-cookie等组件也可以生成除非被清理,否则一直存在;浏览器关闭还会保存在本地,但是不支持跨浏览器页面关闭就清理刷新依然存在,不支持跨页面交互除非被清理,否则一直存在
数据存储大小4K5M5M不限制大小
与服务端通信每次都会携带在请求的header 中,对于请求性能有影响;同时由于请求中都带有,所以也容易出现安全问题不参与不参与不参与
特点字符串键值对在本地存储数据字符串键值对在本地存储数据字符串键值对在本地存储数据IndexedDB 是一个非关系型数据库(不支持通过 SQL 语句操作)。可以存储大量数据,提供接口来查询,还可以建立索引,这些都是其他存储方案无法提供的能力。

localForage介绍

  • localForage是一个JavaScript库,能够类似localStorage的存储。
  • 他是异步存储,可以优化你的web应用程序的离线体验,而且能存储多种类型的数据。
  • localForage有一个优雅的降级策略,如果浏览器不支持indexedDB或者WebSQL则使用localStorage。
  • 支持es6的 Promises API,而且支持添加回调函数。

localForage安装

npm install localforage

localForage使用

不同于localStorage,你可以存储非字符串类型,存储方式是localForage.setItem(key, value),可以加入第三个参数回调函数,但是因为支持promise,所以一般用then,catch来处理,推荐配合async和await使用。

import localForage from "localforage";
//1:存普通数据 
localforage.setItem('somekey''some value').then(function (value) {
    // 当值被存储后,可执行其他操作
    console.log(value); 
}).catch(function(err) {     
    // 当出错时,此处代码运行     
    console.log(err); 
}); 
//2:存一个数组 
localforage.setItem('myarray', [12'three'])
.then(function(value) {     
    // 如下输出 `1`     console.log(value[0]); 
}).catch(function(err) {     
    // 当出错时,此处代码运行     console.log(err); 
}); 
//3:async/await 
try {     
//await返回结果值,用一个常量接收     
const value = await localforage.getItem('somekey');     
    console.log(value); } 
catch (err) {     
    console.log(err); 
}

讲故事

  • 事情起因是最近在写聊天功能,是安卓内嵌h5,在考虑聊天记录存储问题时因为明白localStorage的大小只有5m所以第一时间想到的是调用安卓接口使用用户的手机存储,于是和安卓开发商讨,他问为什么要用他的存储呢,我坚定不移表示前端的存储能力只有5m,安卓表示我可以存数据库啊,我诧异的想前端怎么会有数据库,再然后就明白了indexDB的存在,遥想之前做图片模糊功能也是,以为浏览器没有模糊图片的能力,但是使用css样式filter:blur(5px)就可以做到了。
  • web的能力并没有想象那么窄。

参考文章: