需求说明
最近学习关于前端缓存的问题。下来来介绍一下关于indexedDB
的一个简单Demo。需要注意的是indexedDB
目前只支持新版浏览器。具体可以参考官方文档。
再来说说这次Demo需要解决的主要问题,在我的用户场景中,大多数用户是移动网络,加载速度超慢且不稳定,鉴于不会经过更新静态资源文件。因此打算使用本地存储来实现资源缓存(不要问我为什么不使用CDN)。
分析实现方案
用户端网络不稳定。
解决方案:尽量较少用户请求,特别是针对于非必要的数据,例如:js 脚本。
使用何种缓存手段。
解决方案:这个问题也就简化到了使用何种方案来实现前端本地存储。常见的有(
localStorage
,indexedDB
,websql
),我们这里采用indexedDB
。如何解决更新问题。
解决方案:每次使用缓存时,更新一下使用时间。设置脚本的名称为索引字段。也可以根据使用时间,废弃掉已不用的缓存内容,节约空间。
代码实现
第一阶段,初始化 indexDB
|
|
初始化一个 indexedDB 数据库,创建一个 `index` 索引,根据存储的数据 `name` 字段.
第二阶段,实现缓存和读取缓存
|
|
setCahce 函数,是将下载好的 js 内容存储到 indexedDB 中, getCache 函数通过 `name` 索引获取对应的 js 缓存内容。
第三阶段,实现业务逻辑
|
|
增加 cacheLists 来记录,已经正在被使用的缓存。
removeCache 函数,是用来更新和删除已过期的缓存。
downloadScript 函数,是用来存储缓存和动态将 script 插入到网页中。
在这里移除缓存的时候,我在这里定义的是未使用缓存超过14天,就删除缓存。
最后,给自己的函数,添加上闭包,阻止 xss 攻击。
|
|
总结
在这里我们使用的是
indexedDB
来缓存本地文件,是因为这个的存储空间是无限的。而localstorage
默认情况下只有 5M, 而web sql
已经被弃用。在缓存文件很多的时候或者因为读取
indexedDB
遇到性能问题时, 我们可以使用web worker service
来操作indexedDB
然后同步到我们的 ui 线程。