关键词:
Indexed Database API简称IndexedDB,是浏览器中存储结构化数据的一个方案。IndexedDB背后的思想是创造一套API,方便JavaScript对象的存储和获取,同时也支持查询和搜索。
IndexedDB是类似于MySQL或Web SQL Database的数据库。与传统数据库最大的区别在于,IndexedDB使用对象存储而不是表格保存数据。IndexedDB数据库就是在一个公共命名空间下的一组对象存储,类似于NoSQL风格的实现。既然是数据库了,那就不是 5M、10M 这样小打小闹级别了。理论上来说,IndexedDB 是没有存储上限的(一般来说不会小于 250M)。
1.IndexedDB的特点
- 键值对储存。
IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。
- 异步
IndexedDB的设计几乎完全是异步的。为此,大多数操作以请求的形式执行,这些请求会异步执行,产生成功的结果或错误。绝大多数IndexedDB操作要求添加onerror和onsuccess事件处理程序来确定输出。IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 localStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。
- 支持事务。
IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。
- 同源限制
IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。
- 储存空间大
IndexedDB 的储存空间比 localStorage 大得多,一般来说不少于 250MB,甚至没有上限。
- 支持二进制储存。
IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。
2.IndexedDB 使用流程
在IndexedDB大部分操作并不是我们常用的调用方法,返回结果的模式,而是请求——响应的模式。
接下来,通过一个基本的 IndexedDB 使用流程,旨在对 IndexedDB 形成一个感性的认知:
- 打开/创建一个 IndexedDB 数据库(当该数据库不存在时,open 方法会直接创建一个名为 admin 新数据库)
// 后面的回调中,我们可以通过event.target.result拿到数据库实例
let db
// 参数1位数据库名,参数2为版本号
const request = window.indexedDB.open("admin", 1)
// 使用IndexedDB失败时的监听函数
request.onerror = function(event)
console.log(无法使用IndexedDB)
// 成功
request.onsuccess = function(event)
// 此处就可以获取到db实例
db = event.target.result
console.log("你打开了IndexedDB")
- 创建一个 object store(object store 对标到数据库中的“表”单位)
// onupgradeneeded事件会在初始化数据库/版本发生更新时被调用,我们在它的监听函数中创建object store
request.onupgradeneeded = function(event)
let objectStore
// 如果同名表未被创建过,则新建test表
if (!db.objectStoreNames.contains(test))
objectStore = db.createObjectStore(test, keyPath: id )
- 构建一个事务来执行一些数据库操作,像增加或提取数据等
// 创建事务,指定表格名称和读写权限
const transaction = db.transaction(["test"],"readwrite")
// 拿到Object Store对象
const objectStore = transaction.objectStore("test")
// 向表格写入数据
objectStore.add(id: 1, name: juejin)
- 通过监听正确类型的事件以等待操作完成。
// 操作成功时的监听函数
transaction.oncomplete = function(event)
console.log("操作成功")
// 操作失败时的监听函数
transaction.onerror = function(event)
console.log("这里有一个Error")
#yyds干货盘点#聊一聊前端架构
什么是好架构好的代码和差的代码都能运行,但我们会追求好的代码,获得更好的维护性和可读性。同理没有架构的系统也能工作,但如果一个业务团队没有好的架构,整个团队将陷入混乱,最终难以支撑业务快速变化。架构是... 查看详情
#yyds干货盘点#前端存储之indexdb
...见肘,其实浏览器是有提供大数据量的本地存储的如IndexedDB存储数据大小一般在250M以上。弥补了localStorage容量的缺陷,但是使用要比l 查看详情
#yyds干货盘点#docker安装方法
搜索镜像dockersearchzentao下载镜像dockerpulleasysoft/zentao创建容器#1.宿主机创建目录,用于映射禅道数据mkdir-p/data/zentao/zentaopmsmkdir-p/data/zentao/mysqldata#修改目录权限chown-R33:33/data/zentao/zentaopmschown-R101:101/data 查看详情
#yyds干货盘点#array.groupby()
array.groupBy()假设我们有一个产品列表,其中每个产品都是一个具有2个属性的对象: name 和 category。constproducts=[name:apples,category:fruits,name:oranges,category:fruits,name:potatoes,category:vegetables];在上面的示例 查看详情
#yyds干货盘点#xssvscsrf
在本篇中,我们将解释 XSS 和 CSRF 之间的区别,并讨论 CSRFtoken 是否有助于防御 XSS公鸡。XSS和CSRF之间有啥区别跨站脚本公鸡XSS 允许公鸡者在受害... 查看详情
#yyds干货盘点#js截取文件后缀名
方法一:<inputtype="file"onChange="change(event)"><script>functionchange(event)varfileName=event.target.files[0].name.toLowerCase();varlastIndex=fileName.lastIndexOf(.);varsuffix=fileName.subs 查看详情
#yyds干货盘点#saltshake安装配置
后台:https://github.com/saltshaker-plus/saltshaker_api前端:https://github.com/saltshaker-plus/saltshaker_frontend要求:Python>=3.6Mysql>=5.7.8(支持Json的Mysql都可以)Redis(无版本要求)RabbitMQ(无版本要求)Python软 查看详情
#yyds干货盘点#nodejs后端token权限问题
话不多说,直接上代码登录接口exportdefaultclassAuthControllerstaticasynclogin(req,res)tryconstname,password=req.body;if(!name||typeofname!=="string")res.status(400).json(resultFail("Badnameformat,expectedstring.")); 查看详情
#yyds干货盘点#自适应布局方案
起步rem是什么rem(fontsizeoftherootelement)是指相对于根元素<html>来做计算的字体大小单位。e.g.设置htmlfont-size:75px时,其他元素1rem=75px,4rem=300pxvw是什么vw是基于viewport... 查看详情
#yyds干货盘点#常用less函数
文本行数限制.add-text-row-limit(@row)overflow:hidden;text-overflow:ellipsis;.create();.create()when(@row>1)display:-webkit-box;-webkit-line-clamp:@row;-webkit-box-orient:vertical;.create()when(@row=1)whi 查看详情
#yyds干货盘点#parseint怪异行为
parseInt()是内置的JS函数,用于解析数字字符串中的整数。例如,解析数字字符串100:constnumber=parseInt(100);number;//100如预期的那样,100被解析为整数 100。parseInt(numericalString,radix)还... 查看详情
#yyds干货盘点#前端内存泄露问题
内存泄露指内存被占用且没有及时释放内存泄露越多,计算机剩余的内存就越小,此时越容易发生内存溢出常见的内存泄露情况:意外的全局变量未及时清理计时器或回调函数闭包functionx()a=10;//或者this.a=10;//或者window.a=10;x();//产... 查看详情
#yyds干货盘点#名企真题专题:回文串
1.简述:描述给定一个字符串,问是否能通过添加一个字母将其变为回文串。输入描述:一行一个由小写字母构成的字符串,字符串长度小于等于10。输出描述:输出答案(YES\\NO).示例1输入:coco输出:YES2.代码实现:importjava.util.*;... 查看详情
#yyds干货盘点#可以中断的异步操作
由于JavaScript的单线程特性,能在JavaScript中进行的异步场景其实不多,大概有如下一些:setTimeout() /setInterval()事件Ajax部分对Native方法的调用……中断Ajax操作Ajax处理基本上也可以归为“对Native方法调用”一... 查看详情
#yyds干货盘点#react前端优化小结笔记
编译阶段的优化主要是webpack开发环境时重复构建更快1.include缩小编译的范围rules:[test:/\\.js$/,use:[loader:babel-loader,options:cacheDirectory:true,persets:[@babel/preset-react],plugins:[@babel/plugin-proposal-class-properties]],i 查看详情
#yyds干货盘点#nginx配置ssl证书
申请ssl 证书把证书copy到nginx 目录下,比如我放在了一个叫ca 的目录,一个.cer 文件,一个.key 文件,一共两个文件配置.conf文件serverserver_nameghostwang.xxx.com;#... 查看详情
#yyds干货盘点#慎用json.stringfy
项目中遇到一个bug,一个组件为了保留一份JSON对象,使用JSON.stringify将其转换成字符串,这样做当然是为了避免对象是引用类型造成数据源的污染。但发现后面使用JSON.parse方法之后,发现数据有所变化。代码简化:letobj=name:Gopal... 查看详情
#yyds干货盘点#nginx配置反向代理
闲话不多说,直接上干货。(1)找到nginx配置文件nginx.conf小编是通过docker拉取的nginx,默认配置文件是nginx.conf中引入包含的default.conf文件也就是说nginx.conf配置文件中有如下一个配置include/etc/nginx/conf.d/*.conf;(2)修改配置->实... 查看详情