现代浏览器内部

http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/

主要结构

1、用户界面              如:地址栏,前进后退按钮,书签等

2、浏览器引擎           在用户界面和渲染引擎之间传输指令

3、呈现引擎              解析显示用户请求的内容,几乎都是单线程 除了网络操作

(ie->Trident; firefox->Gecko; Safair->Webkit; chrome and opera ->Blink)

4、网络              应对网络请求,例如http请求

5、用户界面后端        用来绘画基础的窗口部件

6、javascript编译器

7、数据存储               在本地储存各种数据

首先渲染引擎把html解析成DOM树(内容树),每个标签都是一个节点,根节点就是 document ,DOM树包含了所有的html标签,包括display:none的,或者是javascript 加载的元素,然后渲染引擎会解析样式(包括内部和外部的),去掉浏览器不能识别的样式,把样式信息和html中可见的结构结合起来用于创建呈现树(render tree)

webkit呈现引擎的主流程

gecko的主流程

render tree 类似于DOM ,但是区别很大,render tree 能识别样式,里面的每个节点都有自己的样式,渲染树不包括非可视化元素(例如 display:none 的元素和 head 标签),呈现树上元素为带有可视属性(颜色、尺寸等)的矩形组成,它们按照正确的顺序排列。render tree构建完成后,就进入布局流程,给呈现树上每个节点赋予在屏幕上显示时的准确坐标,然后就是painting,遍历呈现树然后用每个节点都会被 UI  backend 画上屏幕。这是一个渐进的过程,为了更好的体验,渲染引擎不必等到整个html加载完毕,就会开始构建呈现树和设置布局,在不断接收剩余内容的同时,渲染引擎就会将部分内容解析显示出来

render tree和DOM树的关系

about parser

解析一个文档就是把它翻译成一种有意义代码能理解的结构,结果通常是把文档的结构翻译成由节点组成的树形结构,称之为一个解析树(a parse tree),解析基于文档遵循的语法规则。能够解析的格式称之为 context free grammar(上下文无关语言) ,由特定词汇和语法规则组成,不是人类使用的语言。因此解析时分两个组件 词汇分析 和 语法分析。

有两种解析程序,自上而下和自下而上,自上而下的从最高的规则开始解析,而自下而上的会扫描进来内容直到有规则匹配

HTML parse

HTML不能被上面说的解析程序解析,因为它不是 context free grammar,HTML语法宽松不严谨,它不能被 XML 解析程序解析,它的定义标准是一种 DTD 格式。

HTML有自己的解析程序,分为 tokenization  和 tree construction ,当tree construction解析完成后,该文档被标记为可交互的,然后处理 deferred 脚本,然后 才会触发 load  事件

DOM

DOM 是文档对象模型的缩写,是HTML文档的对象表示,同时也是外部内容(如javascript)与HTML 元素之间交互的接口,DOM 和HTML 标签几乎是一一对应关系

CSS parsing

css是 context free grammar , 把每个CSS 文件解析成StyleSheet Object,每个对象包含CSS rules

Javascript 和 CSS  处理顺序

web 模型是同步的,当解析程序遇到<script>会立刻解析和执行其中代码,中断对文档的解析直到脚本被执行完,如果脚本式外部导入的,那么必须中断解析从网络中取得外部脚本。如果不想中断解析可以给脚本添加 defer属性,在html5 可以把脚本标记为 asynchronous (异步的)

webkit 和 firefox 对此作了优化,当解析运行脚本的时候,其他线程继续解析,但要注意的是,它只是解析加载外部的资源,像外部导入的 CSS , Javascript , 图片, 它并不会对DOM进行修改,这由主线程负责。

CSS 就不一样,它不会中断文档的解析,除非脚本中断时需要用到,如果此时该 CSS 还没有没加载或者解析,会导致脚本执行出不正确的结果,所以firefox 会禁止所有脚本当CSS还没有被加载和解析完,webkit 会禁止脚本当它需要操作的样式属性可能被未加载的 CSS 影响时。

JS引擎大致执行步骤:

1. JS引擎会先预编译一次,预编译就是创建当前执行环境下的活动对象(当前作用域,可用变量的集合),将当前环境下var申明的变量先初始化为undefined,而function保留字定义的函数的字面量Literals会直接赋给活动对象。

2. JS引擎进入解析执行阶段,从上到下逐行执行。遇到直接变量(1,2,"a")会直接处理;而遇到要解析的变量,会先从活动变量中查找,没有找到的话再从prototype,其次作用域链里查找。

在一个函数还未调用(apply,call,或"()")时,它在JS引擎中只是以字面量Literals的形式储存在对象中(就和字符串一样)

而当我们调用一个函数时,JS引擎又会在该函数内部按以上两步执行。

时间: 2024-10-23 19:32:47

现代浏览器内部的相关文章

前端必读:浏览器内部工作原理

前端必读:浏览器内部工作原理 作者: Tali Garsiel  发布时间: 2012-02-09 14:32  阅读: 56974 次  推荐: 88   原文链接   [收藏] 目录 一.介绍 二.渲染引擎 三.解析与DOM树构建 四.渲染树构建 五.布局 六.绘制 七.动态变化 八.渲染引擎的线程 九.CSS2可视模型 英文原文:How Browsers Work: Behind the Scenes of Modern Web Browsers 一.介绍 浏览器可以被认为是使用最广泛的软

浏览器内部工作原理

转:http://kb.cnblogs.com/page/129756/#chapter9 目录 一.介绍 二.渲染引擎 三.解析与DOM树构建 四.渲染树构建 五.布局 六.绘制 七.动态变化 八.渲染引擎的线程 九.CSS2可视模型 英文原文:How Browsers Work: Behind the Scenes of Modern Web Browsers 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到g

浏览器内部缩放与浏览器窗口缩放

接到一个需求,要做网页的自适应.要求网页在不同的分辨率下显示出相应的效果. 之前一直很模糊,浏览器内部的缩放是不是就能模拟出不同的分辨率呢?解释起来有点复杂. 1:浏览器内部的缩放是指网页在浏览器内部的显示比例.在chrome里面 通过Ctrl+/-来调节. 举个例子:比如桌面的分辨率是1920*1080,浏览器窗口大小没有改变,你的网页的显示默认是100%情况下. 如果减少网页的显示比例,那么,你的网页的实际分辨率为(1929*1080)*XX%,这样可能会出现网页显示不正常的情况. (正常情

浏览器内部工作原理(转载)

原文: http://taligarsiel.com/Projects/howbrowserswork1.htm 转自:http://www.cnblogs.com/cnwebdeveloper/articles/2234423.html 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.com到你看到google主页过程中都发生了什么. 将讨论的浏览器 今天,有五种主流浏览器——IE.Firefox.Safari.Chrome及Oper

微信内置浏览器私有接口WeixinJSBridge介绍

原文地址:http://www.3lian.com/edu/2015/05-25/216227.html 这篇文章主要介绍了微信内置浏览器私有接口WeixinJSBridge介绍,本文讲解了发送给好友.分享函数.隐藏工具栏.隐藏三个点按钮等功能,需要的朋友可以参考下 微信网页进入,右上角有三个小点,没错,我们用到的就是它!我们只要通过将小点列表下的按钮进行自定义,就可以随心所欲的分享我们自己的内容了. 注意:(WeixinJSBridge只能在微信内打开的网页有效) 按钮一之------发送给好

现代浏览器的工作原理

浏览器的主要组件包括: 用户界面- 包括地址栏.后退/前进按钮.书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分 浏览器引擎- 用来查询及操作渲染引擎的接口 渲染引擎- 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来 网络- 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作 UI 后端- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接

跨浏览器的placeholder-jQuery版(jQuery插件EnPlaceholder)

案例:整搜索框,需要默认占位符为"请输入关键词",获取焦点时,占位符消失或不可用(不影响正常输入),丢失焦点后,若用户无内容输入,占位符继续出现,继续占位.这种代码我想前端们已经很容易就写出来了吧,现在HTML5原生就有这个"placeholder"属性,效果与上边案例描述的一样(各支持的浏览器内部表现可能不一致,但是作用是一致的),那么这一属性该怎么优雅降级到支持所有现代浏览器呢?答案还是脚本即JavaScript. 上述案例的一个图例:     下面我们就使用

[转载]浏览器的工作原理:新式网络浏览器幕后揭秘

原文地址 序言 这是一篇全面介绍 WebKit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大量研究的成果.在过去的几年中,她查阅了所有公开发布的关于浏览器内部机制的数据(请参见资源),并花了很多时间来研读网络浏览器的源代码.她写道: 在 IE 占据 90% 市场份额的年代,我们除了把浏览器当成一个"黑箱",什么也做不了.但是现在,开放源代码的浏览器拥有了过半的市场份额,因此,是时候来揭开神秘的面纱,一探网络浏览器的内幕了.呃,里面只有数以百万行计的 C++ 代码.

浏览器本地储存方式有哪些?cookie、localStorage、sessionStorage

现阶段,浏览器提供的储存方式常用的有三种,cookie.localStorage.sessionStorage 1.cookie 概念:cookie 是浏览器中用于保存少量信息的一个对象 基本特征: 1)以域名为单位的,每个网站的cookie都保存在此网站的域名下,当下一次访问该网站的时候,就可以通过cookie访问保存的消息 2)每个浏览器保存cookie的位置不同,都保存在浏览器内部,可以通过相应的操作查看 3)每个浏览器保存cookie的数量限制不同,一般每个网站下不大于50个,不大于4k