浏览器渲染网页过程-JavaScript的执行过程

159 阅读3分钟

image.png

用户输入网址发生的事情:

当在浏览器输入一个网址时,比如www.baidu.com,首先会由dns(域名服务器)解析,得到真实的ip地址,然后会向服务器发送请求,服务器响应得到一个html文件(index.html),随后浏览器解析这个文件,当遇到link标签会下载css文件,遇到script标签会下载js文件。接下来就是渲染这些文件了。

image.png

浏览器的渲染过程:

  1. html文件里面的标签会被HTML Parser解析成DOM Tree,与此同时JavaScript代码也可能对DOM进行操作从而构成DOM Tree。此处的JavaScript代码是谁来执行的?答案就是js引擎。
  2. css会被浏览器内核中的CSS Parser解析,形成css规则,css规则和DOM树结合形成一个渲染树,通过layout(布局)生成最终的渲染树。为什么要有layout呢?因为有的屏幕大小不一,那么元素所放到的位置也不一样。有了渲染树之后就可以绘制了,最终展现出来。

html文件中的代码是从上到下依次执行的遇到谁执行谁。

image.png

浏览器内核和js引擎的关系:

这里我们先以WebKit为例(WebKit是Safari-苹果浏览器内核,Google Chrome内核以前也是它,现在Chrome内核是Blink),WebKit事实上由两部分组成的:

1、WebCore:负责HTML解析、布局、渲染等等相关的工作;

2、JavaScriptCore:解析、执行JavaScript代码;

image.png

image.png

程序员编写的代码最终都是由CPU执行的,但是像JavaScript这种高级语言代码,计算机本是不认识的,是通过js引擎将js代码转换成机器指令最终才能被CPU所执行。

V8引擎的原理:

V8是用C++编写的Google开源高性能JavaScript和WebAssembly引擎,V8可以独立运行,也可以嵌入到任何C ++应用程序中;它用于Chrome和Node.js等。

1、js代码会经过parse解析,parse解析分为词法分析和语法分析。词法分析后再经过语法分析之后生成AST抽象语法树,再经过ignition解释器解析成字节码,最后转为汇编语言再运行。为什么转成字节码不直接生成机器码?因为考虑到代码会在不同的环境下执行,不同环境下的CPU需要的机器码指令是不同的,但是生成字节码可以跨平台,当在不同环境下运行时JS引擎会直接将字节码转换为相应CPU能够执行的机器指令(这样一来比分别转换为机器码更优化)。

词法分析如: const name = “why” 经过词法分析会生成tokens数组,里面存放的是一个个对象[{type: “keyword”, value:‘const’},{type:‘identifier’, value: ‘name’}…]

2、TurboFan是一个编译器,可以将字节码编译为CPU可以直接执行的机器码;

3、同时会收集TurboFan优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算);

4、如果函数只调用一次,Ignition会执行解释执行ByteCode;

5、如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能;

6、但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;所以编写TS代码运行效率就会高一点。

image.png

image.png

image.png

image.png