浏览器解析渲染「html」的过程

* 实际过程模拟

  1. 用户输入网址(一般前后端分离的项目NG定位的都是index.html),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,读取到<head>标签内有一个<link>标签引用外部CSS文件;
  3. 发出下载CSS文档的请求,服务器响应;
  4. 继续载入html<body>部分的代码,用已有的CSS进行DOM结构构建;
  5. 假设页面引用了一张<img>,向服务器发出下载请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此执行重排。
  7. 文件尾部,引入了一个<script>标签,执行其中的立即执行的脚本;
  8. JS脚本执行了style.display=”none”,假设为隐藏某个<div>`,隐藏该内容。
  9. 直到遇到</html>,表示执行完了此次的页面加载渲染过程
  10. 此时,假设用户点击页面的“换肤”按钮,JS让浏览器换了一下<link>标签的CSS路径,也就是执行了脚本中那部分交互逻辑;
  11. 浏览器检查各个元素,重新渲染页面。

* 流程分析

  1. 浏览器下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。
  2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。
  3. 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。
  4. 并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。(阻塞下载)
  5. 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。.
  6. JS、CSS中如有重定义,后定义函数将覆盖前定义函数。

* JS的加载

  1. 不能并行下载和解析(阻塞下载)
  2. 当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有代码直接改变了DOM树结构,比如使用 document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以 就会阻塞其他的下载和呈现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容