面试: 页面渲染的过程

457 阅读2分钟

客户端从服务器获取到需要渲染的页面源代码后开辟一个‘GUI渲染线程’,自上而下解析代码,最后绘制出对应的页面,自上而下渲染解析代码的过程是‘同步’的,但也有些操作是“异步”的。

  1. 关于css资源的加载
  • 遇到<style>内嵌样式 =>‘同步’交给GUI渲染线程解析

  • 遇到的是<link>外链样式 => ‘异步’开辟一个新的‘HTTP网络请求线程’ [‘异步:’不等待资源信息请求回来,GUI渲染线程继续向下渲染;待GUI渲染线程同步操作都处理完成后再把HTTP网络线程请求回来的资源文件解析渲染 ]
    注意:同一源下,根据不同的浏览器,最多只允许同时开辟4~7个线程“HTTP的并发数”

  • 遇到@import导入样式=>‘同步’开辟一个新的‘HTTP网络请求线程’去请求资源文件,但在资源文件没有请求回来之前,GUI渲染线程会被‘阻塞’,不会允许其继续向下渲染

  1. 遇到<script>资源请求 默认都是‘同步’的,必须基于HTTP网络线程,把资源请求回来之后,并且交给“JS渲染进程”渲染解析完成之后,GUI渲染线程才能继续向下渲染,所以<script>默认也是“阻碍GUI渲染”的
  • async属性 <style async> 开辟一个HTTP网络请求线程去加载资源文件,同时GUI渲染线程继续向下渲染[把同步改成异步],但是一旦资源请求回来就中断GUI渲染,先把请求回来的js进行渲染解析

  • defer属性

<style defer> <style async> 相似,不同的是defer与link类似,是在GUI同步代码渲染完成后才会对请求回来的js进行渲染解析

  1. 遇到<img>或者音频资源异步’同 <link>

页面渲染步骤#

  • 生成DOM tree : 自上而下渲染完页面,整理好整个页面的DOM结构关系
  • 生成CSS tree: 把所有的样式资源请求加载回来后,按照引入css顺序,依次渲染样式代码,生成样式树
  • 生成 Render tree(Dom tree + CSS tree) 注意: display:none;不会在渲染树内生成