浏览器的原理

一、介绍

  浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到google主页过程中都发生了什么。

  将讨论的浏览器

   今天,有五种主流浏览器——IE、Firefox、Safari、Chrome及Opera。

  本文将基于一些开源浏览器的例子——Firefox、Chrome及Safari,Safari是部分开源的。

  根据W3C(World Wide Web Consortium万维网联盟)的浏览器统计数据,当前(2011年5月),Firefox、Safari及Chrome的市场占有率综合已接近60%。(原文为2009年10月,数据没有太大变化)因此,可以说开源浏览器已经占据了浏览器市场的半壁江山。

  浏览器的主要功能

  浏览器的主要功能是将用户选择的web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDF、image及其他格式。用户用URI(Uniform Resource Identifier统一资源标识符)来指定所请求资源的位置,在网络一章有更多讨论。

  HTML和CSS规范中规定了浏览器解释html文档的方式,由W3C组织对这些规范进行维护,W3C是负责制定web标准的组织。

  HTML规范的最新版本是HTML4(http://www.w3.org/TR/html401/),HTML5还在制定中(译注:两年前),最新的CSS规范版本是2(http://www.w3.org/TR/CSS2),CSS3也还正在制定中(译注:同样两年前)。

  这些年来,浏览器厂商纷纷开发自己的扩展,对规范的遵循并不完善,这为web开发者带来了严重的兼容性问题。

  但是,浏览器的用户界面则差不多,常见的用户界面元素包括:

    • 用来输入URI的地址栏
    • 前进、后退按钮
    • 书签选项
    • 用于刷新及暂停当前加载文档的刷新、暂停按钮
    • 用于到达主页的主页按钮

  奇怪的是,并没有哪个正式公布的规范对用户界面做出规定,这些是多年来各浏览器厂商之间相互模仿和不断改进的结果。

  HTML5并没有规定浏览器必须具有的UI元素,但列出了一些常用元素,包括地址栏、状态栏及工具栏。还有一些浏览器有自己专有的功能,比如Firefox的下载管理。更多相关内容将在后面讨论用户界面时介绍。

  浏览器的主要构成(High Level Structure)

  浏览器的主要组件包括:

  1. 用户界面 - 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。

  2. 浏览器引擎 - 用来查询及操作渲染引擎的接口。

  3. 渲染引擎 - 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。

  4. 网络 - 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作。

  5. UI后端 - 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。

  6. JS解释器 - 用来解释执行JS代码。

  7. 数据存储 - 属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术

图1:浏览器主要组件

  需要注意的是,不同于大部分浏览器,Chrome为每个Tab分配了各自的渲染引擎实例,每个Tab就是一个独立的进程。

  对于构成浏览器的这些组件,后面会逐一详细讨论。

二、渲染引擎(The rendering engine)

  渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容。

  默认情况下,渲染引擎可以显示html、xml文档及图片,它也可以借助插件(一种浏览器扩展)显示其他类型数据,例如使用PDF阅读器插件,可以显示PDF格式,将由专门一章讲解插件及扩展,这里只讨论渲染引擎最主要的用途——显示应用了CSS之后的html及图片。

  渲染引擎简介

    本文所讨论的浏览器——Firefox、Chrome和Safari是基于两种渲染引擎构建的,Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safari和Chrome都使用webkit。

  Webkit是一款开源渲染引擎,它本来是为Linux平台研发的,后来由Apple移植到Mac及Windows上,相关内容请参考http://webkit.org

  渲染主流程(The main flow)

   渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成。

  下面是渲染引擎在取得内容之后的基本流程:

  解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树

图2:渲染引擎基本流程

  渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。

  Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。

  Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。

  值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

解析html 为DOM 树 :
1)HTML字节流解码变为字符流。根据不同编码方式,如UTF-8 GBK来解码
2)词法分析:将字符流解析为一个个词语
3)语法分析:通过不同标签,生成node节点
4)构建DOM树:将node节点组织成DOM树

<html>
    <body>
    <p>Hello World</p>
    <div>![](example.png)</div>
    </body>
</html>

CSS解析器读取CSS文件,得到元素最匹配的样式
1)经过词法分析和语法分析,生成一个个CSS规则。规则由选择器和一个key:value对组成的属性集合构成
2)进行规则匹配:根据元素信息,如id class 标签,通过不同优先级得到元素最匹配的CSS规则

p,div {
            margin-top: 3px;
            }
        .error {
            color: red;
            }

渲染树结构:
生成RenderObject树:由DOM树构建RenderObject树,并将CSS得到的元素匹配的样式存入到RenderObject中。

布局渲染树 : 根据RenderObject中的样式属性,先测量元素的宽高,这个过程一般需要递归,因为父元素的大小会受到子元素影响。然后计算根据框模型,由paddind border margin计算布局。

绘制渲染树 : 先绘制元素背景,然后是浮动部分,最后是前景(content,padding,border等部分)。最后得到了用户可见区域(ViewPort)的内存表示。

通常页面的加载速度会受HTML,CSS ,JS 的影响,那么三者又是怎么加载的?

HTML ,CSS, JavaScript 加载顺序

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Demo</title>
        <link rel="stylesheet" href="./style1.css">
        </head>
    <body>
        <P>Hello Alibaba!</P>
        <section> Hello Alibaba!</section>
        ![](./Alibaba.jpg)

    <script src="./main1.js"></script>
    </body>
    </html>

上述代码是最普通也是最简单的一个HTML模板页面,也遵循了样式表置于head、脚本置于与底端这些基本准则,下面我们来分析一下浏览器如何按时间一步一步的加载出这个页面:


1.  浏览器接收到HTML模板文件,开始从上到下依次解析HTML;
2.  遇到样式表文件style1.css,这时候浏览器停止解析HTML,接着去请求CSS文件;
3.  服务端返回CSS文件,浏览器开始解析CSS;
4.  浏览器解析完CSS,继续往下解析HTML,碰到DOM节点,解析DOM;
5.  浏览器发现img,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
6.  服务器返回图片文件,由于图片占用了一定面积,影响了页面排布,因此浏览器需要回过头来重新渲染这部分代码;
7.  碰到脚本文件,这时停止所有加载和解析,去请求脚本文件,并执行脚本;
8.  加载完所有的HTML、CSS、JS后,页面就出现在屏幕上了。



 

猜你喜欢

转载自blog.csdn.net/qq_36195950/article/details/81430757