面试题之浏览器原理

一、构成

浏览器作为一个客户端,也是使用最广的一款软件,主要使用c++代码编写,他的主要构成:

1. 用户界面:
包括地址栏、后退/前进按钮、书签目录、刷新按钮等。也就是除了显示请求内容的主窗口之外的部分。
2. 浏览器引擎:
用来查询和操作渲染引擎的接口。
3. 渲染引擎(呈现引擎):
用来处理资源内容,并显示处理结果,也就是我们所说的内核。
4. 网络:
完成网络调用。
**5. UI后端 : **
底层使用操作系统的用户接口,具有不特定平台的通用接口。
6. js解析器 :
解释执行js脚本。
**7. 数据存储 : **
占用一定的硬盘实现数据的存储。

二、简单流程
当我们从浏览器地址栏中输入一个域名地址,触发网络请求,网络层得到响应以后,渲染引擎会从网络层中获取请求回来的文档内容,内容大小有一定限制。渲染引擎开始解析请求回来的资源,最后把解析之后的内容结合UI后台,通过调用操作系统的api绘制我们的主要内容,此时操作系统的api则会根据硬件的不同绘制出不同的效果。

三、逐步分析

渲染引擎(呈现引擎)

  1. 基本功能

渲染引擎即内核,浏览器核心的部分,负责解析和呈现资源。浏览器能解析什么样的资源取决于内核能解析什么样的资源。默认情况下,渲染引擎可以显示html、xml文档和图片。如果要解析其他资源可以借助扩展插件或者第三方插件。浏览器呈现什么样的样式取决于渲染引擎渲染成什么样的页面格式,不同浏览器因为内核不同,展现出来的页面格式不同。所以我们平时做样式的兼容是根据内核的不同去区分浏览器的。而JS语法的支持程度和运行速度是根据JS解析引擎去控制。

  1. 基本流程

以解析html为例(最常见的文件),首先将文档内容转换为DOM树节点。同时解析CSS映射成为CSSOM用于构建呈现树。呈现树构建好以后会布局每个节点的坐标。布局好确切坐标以后开始遍历渲染树,根据UI后台绘制每个节点。呈现给用户。
值得注意的是,渲染引擎解析的过程是逐步完成的,并不会等到所有的html都解析完以后再去布局Render树,解析一部分内容就显示一部分内容,以增加用户体验。

  1. DOM树构建和解析

在DOM树构建以前不管是Webkit还是Geoko,都有解析这个过程。当拿到一个html文件,根据词汇和语法规则从上到下解析,把html对应解析为语法树。所以我们在编写html的时候,最开始就需要告诉解析器,我们这个文档的类型(DOCTYPE)是什么,他才知道按照什么样的语法规则去解析。值得注意的是,html解析器只会将html标识解析为语法树(由w3c制定的标识规范,语法树概念自查),语法树生成以后会映射成为DOM树,映射为对应的DOM元素以及属性节点,这时就有了我们的DOM对象,并且提供了相关的DOM接口给脚本语言调用。所以最后我们得到的DOM树就是以根为Document的对象,并与标签建立一一对应的树状关系。

那DOM树构建是从何时开始呢?
从接收到文档开始进行转码,同时把转码后的标记构建成DOM树,这两个过程就是标记化和树构建。同样的DOM标准也是w3c制定
(http://www.w3.org/DOM/DOMTR)。解析的具体算法不做深入讨论,可以在对应的规范文档中查看具体的算法详情。,另外提一点,如果你同时在学习DOM的api,你需要知道DOM树构建和遍历节点的规则。我们都知道DOM树的构建是逐个节点去构建的,他遍历也是逐个节点去遍历的,并且是深度遍历,即要等到该节点以及其后代节点全部遍历完成才会去遍历他的同级节点。生成DOM树的时候遍历生成完最后一个节点,DOM树构建完成,然后才会触发domcontentloaded事件。

  1. .css解析

在构建DOM树的时候遇到js和css元素,html解析器就会将控制器转让给js解析器或者css解析器,去构建CSSOM。CSS的规范同样是w3c制定的。有专门的css解析器。因浏览器内核而异,使用的css解析器也有差异。css解析器按照自己的规则解析成Stylesheet对象。外部css的引入并不会让文档停止解析,包括图片的引入,都是并发进行的,因为样式并不会改变DOM树的结构。

  1. 脚本解析

在遇到脚本时文档将停止解析,直到脚本执行完成。如果脚本是外部的,会等到资源获取完成以后才会继续解析。同时,在外部脚本引入的标签中,有‘defer’去标记此脚本时同步引入还是异步引入,以此作为文档是否停止解析的依据。如果为异步,浏览器则会新建立一个线程去解析文档。如果此时脚本有对DOM更改的操作,会再次让DOM重新构建。同时我们需要知道另外一个件事情,现代浏览器js的运行并不是渲染引擎所做的事情,而是有专门的js引擎,上表有列出各大浏览器对应的js解析引擎,其中V8是运行速度最快的js引擎。

  1. 呈现树构建

DOM树构建完之后,浏览器把DOM树中的一些不可视元素去掉,然后与CSSOM合成一棵呈现树,呈现树在不同内核的浏览器中叫法不一样,webkit中叫Render tree,Geoko中交Frame tree,但是最终结果是一样的。由可视化元素按照顺序组成的树,也是HTML文档的可视化表现形式,通过用户界面的基础组件绘制。在DOM树构建的同时,渲染树也在构建,并不是等到DOM树构建完成以后再去构建渲染树的。我们知道,在css样式中,某些属性会导致呈现结构的改变,例如:display:none。这类的节点不会构建到呈现树中,因此在呈现树中都有与之对应的DOM树节点,但是在DOM树中,不一定有与之对应的呈现树节点。我们通过api去获取DOM节点的时候,哪怕是display:none的节点。我们也能获取的到。因为它对应的DOM节点对应已经构建好了。

  1. Layout(布局)&Reflow(回流)

有了呈现树以后,渲染引擎已经知道网页中有哪些节点以及各个节点的CSS定义和他们的从属关系,则开始计算他们在屏幕之中的位置(css的定位等属性)。这个过程在webkit中叫layout布局,在Geoko中叫reflow回流。这也涉及到了我们平时所说的回流,一个页面的呈现必定会引起一次回流和重绘,就是在第一次构建呈现树的时候。

  1. Painting(绘制)

从上面的图中,我们可以看到,不同内核的实现差异就在DOM到Layout或者说Reflow的过程中。前面的步骤完成以后,渲染引擎知道哪些节点显示的位置和节点的css属性,按照计算出来的规则,通过UI后台,根据显卡等硬件把内容显示到浏览器主窗口上。
所以我们在说回流的时候必定会引擎重新绘制。当然其他的操作,如果改变了DOM结构、CSSOM结构、呈现树结构的都会引起一次回流和重绘。除了这些原因以外,图片下载完成后,需要对布局进行更改,也会引起一次重绘,因为图片是在绘制阶段去渲染的(图片的加载会在浏览器资源文章分享)。

简单的说一下整个过程:

地址栏输入地址触发网络请求,获取到html文件。
HTML解析器解析HTML文件构建成为DOM树。
遇到CSS通过CSS解析器解析成为CSSOM。
遇到JS通过JS解析器解析。
DOM Tree和CSSOM构建呈现树(6、7两个步骤)。
呈现树根据结构样式确定节点的位置(布局或者回流) ----回流。
确定好位置以后,根据外观样式绘制 ----重绘。
通过UI后台和用户界面组件把内容显示到浏览器主窗口上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值