let openRequest = indexedDB.open('TEST', 1); openRequest.onsuccess = () => { console.log('数据库创建成功');//数据库创建成功 } openRequest.onerror = () => { console.log('数据库创建失败'); } openRequest.onupgradeneeded = () => { let db = openRequest.result; let students = db.createObjectStore('students', { keyPath: 'id' }); //let index = students.createIndex('name_index', 'name'); }
注意: 对表(对象库)的增/删/改操作都必须在onupgradeneeded事件中进行
删除表的语法为db.deleteObjectStore('表名')
3、事务
通过事务添加记录
表建好了,接下来就是操作表中的记录了!
所有记录的操作都必须在 IndexedDB 中的事务内进行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
const add=()=>{ let openRequest2=indexedDB.open('TEST', 1); openRequest2.onsuccess=()=>{ let db=openRequest2.result; let transaction=db.transaction('students', 'readwrite'); let students=transaction.objectStore('students'); let stu={ id: 1234, name:'德洛丽丝' } let request=students.add(stu); request.onsuccess=()=>{ console.log("添加成功"); } request.onerror=()=>{ console.log("添加失败"); } } }
网络进程接收到响应头之后,会根据响应头中的 content-type 字段来判断文件的类型,比如 content-type 的值是text/html,那么浏览器进程就会判断这是一个 HTML 类型的文件,然后为该请求选择或者创建一个渲染进程。渲染进程准备好之后,网络进程便经由渲染进程的IO线程向渲染进程的消息队列添加一个DOM解析任务,同时网络进程和渲染进程之间会建立一个共享数据的管道,网络进程接收到数据后就往这个管道里面放,而渲染进程则从管道的另外一端不断地读取数据,并同时将读取的数据“喂”给 HTML 解析器。你可以把这个管道想象成一个“水管”,网络进程接收到的字节流像水一样倒进这个“水管”,而“水管”的另外一端是渲染进程的 HTML 解析器,它会动态接收字节流,并将其解析为 DOM
HTML解析器的工作原理
HTML解析器将HTML字节流解析为DOM的过程如下图:
由上图可知,解析过程分为三个阶段。下面分别阐述:
1、通过分词器将字节流转换为 Token
同“编译、解释和执行代码”一篇中一样,这儿也需要解析为Token
这儿的Token分为 Tag Token 和文本 Token。上述 HTML 代码通过词法分析生成的 Token 如下所示
解析到script标签时,HTML解析器判断这是一段脚本,因此解析器便会暂停解析,然后JS引擎执行这段脚本(因为JS代码可能要更改当前生成的DOM结构)。因为这段 JavaScript 脚本修改了 DOM 中第一个 div 中的内容,所以执行这段脚本之后,div 节点内容已经修改为 time.geekbang 了。脚本执行完成之后,HTML 解析器恢复解析过程,继续解析后续的内容,直至生成最终的 DOM
从外部引入JS代码如何影响
如下述代码所示,我们从外部引入JS代码,那么此时这段JS代码又将如何影响DOM的构建呢?
1 2 3
//foo.js let div1 = document.getElementsByTagName('div')[0] div1.innerText = 'time.geekbang'
1、使用 async 标志的脚本文件一旦加载完成,会立即执行;而使用了 defer 标记的脚本文件,需要在 DOMContentLoaded 事件之前执行。2、DOMContentLoaded事件发生后,说明页面已经构建好 DOM 了,这意味着构建 DOM 所需要的 HTML 文件、JavaScript 文件、CSS 文件都已经下载完成了
注意上图中的两个空闲时间:1、请求 HTML 数据和构建 DOM 中间有一段空闲时间,这个空闲时间有可能成为页面渲染的瓶颈。2、就是在 DOM 构建结束之后,预解析的CSS文件还未下载完成的这段时间内,渲染流水线无事可做,因为下一步是合成布局树,而合成布局树需要 CSSOM 和 DOM,所以这里需要等待 CSS 加载结束并解析成 CSSOM