浏览器的底层运行机制

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

首先,按照惯例,依旧是一波小小的复习

一、复习

1.进程和线程

  • 进程:指一个程序(或浏览器打开一个页面就是开辟一个进程)

  • 线程:程序中具体执行任务的一个进程中可能包含一到多个线程!!

    • 单线程:同时只能处理一件事,上一件事处理完,下一件事才能处理「同步编程」

    • 多线程:可同时处理多件事情,上一件事情即便没有处理完,下一件事也可以交给其他线程去处理「异步编程」

2.浏览器的渲染进程

浏览器打开一个页面就是开辟一个进程,每个进程中会包含多个线程「浏览器是多线程的」!!

  • GUI渲染线程:渲染解析HTML/CSS代码,并且绘制页面 =>W3C

  • JS引擎线程:渲染解析JS代码 =>ECMAScript「ECMA」

  • 定时器监听线程:设置定时器后,浏览器就会分配一个线程(小人)去监听定时器是否到时间

  • 事件监听线程:完成事件绑定后,也会分配一个线程去监听事件是否触发

  • HTTP网络线程:分配一个线程,去服务器获取相关的资源信息 「并发上限:同源下最多开辟5~7个」

接下来正式开始!

二、浏览器底层渲染机制

当基于HTTP网络,从服务器端获取到页面源代码后,到浏览器把其绘制成页面,中间所做的事情,就是我们要研究的渲染机制!

1. 创建DOM TREE(DOM树)

image.png
GUI首先渲染所有的HTML结构,计算出结构之间的层级关系
触发DOMContentLoaded事件:window.addEventListener(‘DOMContentLoaded’,function(){…})

2. 创建CSSOM TREE(样式树)

image.png

样式树:渲染解析CSS完毕后,GUI按照原先导入的顺序,依次解析CSS代码,记录了相应节点应该具备的样式「包括继承的样式、或者根据优先级重构的样式等等」

3. 生成RENDER TREE「渲染树」

把DOM TREE 和 CSSOM TREE 合并在一起生成RENDER TREE

渲染树中详细记录了DOM的层级结构和每个节点应该具备的样式!!

4. Layout布局

根据可视窗口大小,按照RENDER TREE,计算出每个节点在视口中的位置和排版等「含:位置、方向、大小、排列方式…」

5. 分层

规划出页面各个文档流(层面)中,所有节点的具体绘制步骤!!

6. Painting绘制

GUI根据上一步计算出来的步骤,开始绘制页面即可!!

触发load事件:window.onload=function(){…}

三、渲染页面流程的步骤

  • 打开页面,浏览器首先分配一个“HTTP线程”去服务器获取HTML资源;

  • 获取资源后,分配“GUI渲染线程”自上而下,逐行渲染解析HTML代码!

    • 渲染HTML/CSS代码:遵循W3C规则,GUI渲染线程去处理

    • 渲染JS代码:遵循ECMAScript(ECMA-262)规则,JS引擎线程去处理

    • 在渲染代码过程中,如果遇到 link/img/script[src=xxx]/audio/video 等,浏览器需要开辟“HTTP线程”,从服务器端获取到对应的资源文件(文件中的代码)

1.遇到<link>

  • 浏览器分配一个“HTTP线程”去服务器获取CSS样式

  • 同时GUI会继续向下渲染「异步」

  • 等待HTML渲染解析完毕「DOM TREE已经构建」,并且CSS样式“都已经”获取到了,再按照之前导入样式的顺序,逐一渲染解析CSS样式「创建CSSOM TREE」!

    • 目的:确保CSS优先级(层级)的准确,所以渲染顺序需要和之前编写的导入顺序一致

    • 如果某个资源一直没有响应,或者响应结果是获取失败,则忽略它的渲染!

1.1link三种 CSS 样式的渲染区别

  • 渲染过程中遇到 则开辟新的HTTP线程去获取资源文件,GUI不受影响,继续向下渲染“异步” 【代码多的时候 用link】

  • 如果遇到的是

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容