浏览器的渲染与交互 | 青训营笔记

73 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

浏览器渲染

渲染器进程的核心任务是把HTML、CSS和JavaScript转换成用户可以交互的网页

解析HTML

  • 构建DOM:渲染器在接收到导航提交的信息的时候,就开始解析HTML的文本字符串,并将它转化成DOM树。
  • 加载子资源:网站会用图片,CSS,JavaScript等外部的资源,Chorme这时候就会在解析的同时并发运行“预加载扫描器”,当发现有外部资源的时候,预加载扫描器会将请求发送到网络进程。
  • JavaScript可能堵塞解析:当HTML解析碰到<script>标签的时候会停止解析,并开始运行加载JS代码。deferasync属性会让JS代码进行异步运行。

计算样式

解析完HTML之后,开始解析CSS并且计算每一个元素的样式值,若CSS中未标明元素的样式,则会使用继承属性或者初始值。

布局

得到计算样式之后,还要找到元素间的几何位置信息,通过遍历DOM树及其计算样式构造布局树,布局树中包括元素的坐标以及大小信息。但如果元素中含有display:none,则不会包含在布局树中

绘制

接下来就是确定绘制顺序的问题,因此,主线程遍历布局树开始创建绘制记录。

这就意味着,如果布局树发生改变,绘制记录也要重新生成

合成

有了布局树以及绘制记录,就可以开始绘制页面。就有一个名词的出现,栅格化,就是把上述的信息转换成屏幕上的像素。

现代浏览器会将页面的不同部分先分层然后分别栅格化,再通过独立的合成器线程合成页面。这个过程就是合成

  • 主线程会根据布局树创建分层树,由分层数进行分层
  • 创建分成树之后,主线程会将其交给合成器线程,合成器线程负责将他们栅格化,一层可能有页面那么大,合成器线程会将它切成小片,在进行栅格化,栅格化线程结束任务之后将它们保存在GPU中
  • 所有小片都进行栅格化之后,合成器会收集叫做“绘制方块”的小片信息,合成合成器帧
  • 创建好的合成器帧通过进程间通信IPC提交给浏览器进程

浏览器交互

浏览器的交互主要包括,滚动鼠标,鼠标悬停,触摸屏幕等等都属于浏览器交互。

当发生交互事件的时候,浏览器进程接收到这个手势,但是只知道这个手势在哪个位置,因为标签页的内容是由渲染器进程处理。所以浏览器会将事件类型以及手势位置发送给渲染器进程。渲染器进程会根据事件目标来运行注册的监听程序。

准确来说,是渲染器进程中的合成器线程来处理的,页面合成的时候,合成器线程会把附加了事件处理程序的页面打上“非快速滚动区”(non-fast scrollable region)的记号,有了这个记号之后,合成器线程就会在该区域事件发生的时候把事件发生给主线程。但是如果是在该区域外发生的事件,合成器会继续合成新的合成器帧而不会等待主线程

总结

浏览器的架构,导航,渲染,交互都已整理完,消化了久了一点,所以笔记也分开写了,写前端,总要理解浏览器是如何组成和运作的,就像开挖掘机,总要深入了解挖掘机。才能达到人体合一的境界