HTML文档加载边解析
之前一直以为
html
是加载完之后才由html
解析器进行解析的,学习了浏览器原理之后,才知道。HTML
解析器并不是等整个文档加载完成之后再解析的,而是网络进程加载了多少数据,HTML
解析器便解析多少数据。
具体的详细流程如下:
浏览器的网络进程接收到响应头之后,会根据响应头中的 content-type
字段来判断文件的类型,比如 content-type
的值是“text/html”
,那么浏览器就会判断这是一个 HTML 类型的文件,然后为该请求选择或者创建一个渲染进程。渲染进程准备好之后,网络进程和渲染进程之间会建立一个共享数据的管道,网络进程接收到数据后就往这个管道里面放,而渲染进程则从管道的另外一端不断地读取数据,并同时将读取的数据“喂”给 HTML 解析器。你可以把这个管道想象成一个“水管”,网络进程接收到的字节流像水一样倒进这个“水管”,而“水管”的另外一端是渲染进程的 HTML 解析器,它会动态接收字节流,并将其解析为 DOM。
关于HTML的预解析
一般情况下,html文档解析时,遇到js脚本就会暂停,等待脚本的下载、执行,而下载的也比较依赖网络环境、脚本大小等。针对这个情况,Chrome 浏览器做了很多优化,其中一个主要的优化是预解析操作。当渲染引擎收到字节流之后,会开启一个预解析线程,用来分析 HTML 文件中包含的 JavaScript、CSS 等相关文件,解析到相关文件之后,预解析线程会提前下载这些文件。
原文
极客时间-浏览器工作原理与实践