浏览器那些事儿

一、浏览器的组成
浏览器内核主要分成两部分:渲染引擎和JavaScript解释器(又称JavaScript引擎)。

二、渲染引擎
渲染引擎负责取得网页的内容(HTML、XML、图像等等),整理讯息(例如加入CSS等),以及计算网页的显示方式,然后输出至显示器或打印机。浏览器内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。
1、常用浏览器内核
Trident:早期,IE占有大量的市场份额,以前有很多网页是根据Trident的标准来编写,这个内核对真正的网页标准支持不太好,同时存在许多安全Bug。
代表浏览器:IE

Gecko:优点是功能强大且丰富,可以支持很多复杂网页效果和浏览器扩展接口,缺点是容易消耗内存。
代表浏览器:FireFox

Webkit:优点是拥有清晰的源码结构和极快的渲染速度,缺点是对网页代码的兼容性较低,会导致某些编写不标准的网页无法正常显示。
代表浏览器:Chrome,Safari

Presto:Presto内核被称为公认的浏览网页速度最快的内核,同时也是处理JS脚本最兼容的内核,能在Windows、Mac及Linux操作系统下完美运行。
代表浏览器:Opera

2、渲染引擎处理网页

  • 解析代码:HTML代码解析为DOM,CSS代码解析为CSSOM(CSS Object Model);
  • 对象合成:将DOM和CSSOM合成一棵渲染树(render tree);
  • 布局:计算出渲染树的布局(layout);
  • 绘制:将渲染树绘制到屏幕。

以上四步并非严格按顺序执行,往往第一步还没完成,第二步和第三步就已经开始了。所以,通常网页的HTML代码还没下载完,但浏览器已经显示出内容了。
3、重排和重绘

三、JavaScript引擎
JS引擎负责解析和执行javascript来实现网页的动态效果。 最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。

JavaScript是一种解释型语言,也就是说,它不需要编译,由解释器实时运行。优点是运行和修改都比较方便,刷新页面就可以重新解释。缺点是每次运行都要调用解释器,系统开销较大,运行速度慢于编译型语言。
为了提高运行速度,目前的浏览器都将JavaScript进行一定程度的编译,生成类似字节码(bytecode)的中间代码,以提高运行速度。

JavaScript解释器的作用,是执行JavaScript源码,它通常包含4个组成部分,下面是浏览器内部对JavaScript的处理过程。

1、词法分析器(Lexical Analyser)
词法分析器的作用,是将一行行的源码拆解成一个个词义单位(token)。所谓“词义单位”,指的是语法上不可能再分的、最小的单个字符或字符组合。

首先,词法分析器会扫描(scanning)代码,提取词义单位;然后,会进行评估(evaluating),判断词义单位属于哪一类的值。

var sum = 30;

// 词法分析后的结果
[
  "var" : "keyword",
  "sum" : "identifier",
  "="   : "assignment",
  "30"  : "integer",
  ";"   : "eos" (end of statement)
]

2、句法解析器(Syntax Parser)
句法解析器的作用,是将上一步生成的数组,根据语法规则,转为抽象语法树(Abstract Syntax Tree,简称AST)。如果源码符合语法规则,这一步就会顺利完成,生成一个抽象语法树;如果源码存在语法错误,这一步就会终止,抛出一个“语法错误”。

{
  operation: "=",
  left: {
    keyword: "var",
    right: "sum"
  }
  right: "30"
}

通常,这一步是整个JavaScript代码执行过程中最慢的。
3、字节码生成器(Bytecode generator)
字节码生成器的作用,是将抽象语法树转为JavaScript引擎可以执行的二进制代码。目前,还没有统一的JavaScript字节码的格式标准,每种JavaScript引擎都有自己的字节码格式。最简单的做法,就是将语义单位翻成对应的二进制命令。
4、字节码解释器(Bytecode interpreter)
字节码解释器的作用是读取并执行字节码,将字节码转为机器码。逐行解释将字节码转为机器码,是很低效的。为了提高运行速度,现代浏览器改为采用“即时编译”(Just In Time compiler,缩写JIT),即字节码只在运行时编译,用到哪一行就编译哪一行,并且把编译结果缓存(inline cache)。通常,一个程序被经常用到的,只是其中一小部分代码,有了缓存的编译结果,整个程序的运行速度就会显著提升。不同的浏览器有不同的编译策略,有的浏览器只编译最经常用到的部分,比如循环的部分。有的浏览器索性省略了字节码的翻译步骤,直接编译成机器码,比如chrome浏览器的V8引擎。

四、常用浏览器
Firefox,Chrome,百度,微信,safari,opera,IE10,IE9,IE8,IE7,IE6,IEtester。

五、浏览器的默认行为
PC端,比如浏览器默认提交submit文本框所在的form、跳转超链接。
移动端,比如手机系统默认单页屏幕也可以滚动、长按ios屏幕时触发系统菜单、长按ios和android 屏幕时触发下载图片菜单。

六、判断设备

PC端移动端

原文地址:https://www.cnblogs.com/camille666/p/browser.html