笔记来源:浏览器运行机制详解
1.浏览器页面的渲染流
- 解析html得到DOM树:html解析包含有一系列的步骤,过程为**Bytes -> Characters -> Tokens -> Nodes -> DOM。**最终将html解析为DOM树。
- 解析css得到CSS树:Bytes -> Characters -> Tokens -> Nodes -> CSSOM。
- 合并得到render树
- 布局,当页面有元素的尺寸、大小、隐藏有变化或增加、删除元素时,重新布局计算,并修改页面中所有受影响的部分
- 绘制,当页面有元素的外观发生变化时,重新绘制
- GUI线程将得到的各层的位图(每个元素对应一个普通图层)发送给Browser进程,由Browser进程将各层合并,渲染在页面上
2.Dom的ContentLoaded和load事件
- DOMContentLoaded:当DOM加载完成触发
- load:当DOM,样式表,脚本都加载完时触发
所以DOMContentLoaded在load之前触发
3.css和js的阻塞
对于css:
- 首先,是在Browser进程中下载css文件,当下载完成后,发送给GUI线程。
- 其次,是在GUI线程中解析html及css,不过这两者是并行的。
- 由于css的下载和解析不会影响DOM树,所以不会堵塞html文件的解析,但会堵塞页面渲染。
- 这样的设计是非常合理的,如果css文件的下载和解析不会堵塞页面渲染,那么在页面渲染的途中或结束后发现元素样式有变化,则又需要回流和重绘。
对于js:
js文件的下载和解析执行都会堵塞html文件的解析及页面渲染。
因为js脚本可能会改变DOM结构,若是其不堵塞html文件的解析及页面渲染的话,那么当js脚本改变DOM结构或元素样式时,会引发回流和重绘,会造成不必要的性能浪费,不如等待js执行完,在进行html解析和页面渲染。
如果你不想js堵塞的话,则使用async属性,这样就可以异步加载js文件,加载完成后立即执行。
导致页面无法立即响应的原因:
执行栈中还有任务未执行完,或者是js引擎线程被GUI线程堵塞。
笔记来源:Cookie浅析
直接进网页看把,关于xss和csrf讲解的挺好的。
笔记来源:JavaScript引擎浅析
写的太好了,可以细读。