JHHK

欢迎来到我的个人网站
行者常至 为者常成

WebKit

目录

webkit的组成

每个浏览器都有自己的内核,Safari的内核就是WebKit
简单点讲,WebKit就是一个页面渲染以及逻辑处理引擎,前端工程师把HTML、JavaScript、CSS这“三驾马车”作为输入,经过WebKit的处理,就输出成了我们能看到以及操作的Web页面。

WebKit Embedding API
负责浏览器UI与WebKit进行交互的部分,

WebKit Ports
让Webkit更加方便的移植到各个操作系统、平台上,提供的一些调用Native Library的接口
比如在渲染层面,在iOS系统中,Safari是交给CoreGraphics处理,而在Android系统中,Webkit则是交给Skia。

WebCore

首先浏览器通过URL定位到了一堆由HTML、CSS、JS组成的资源文件,通过加载器(这个加载器的实现也很复杂,在此不多赘述)把资源文件给WebCore。之后HTML Parser会把HTML解析成DOM树,CSS Parser会把CSS解析成CSSOM树。最后把这两棵树合并,生成最终需要的渲染树,再经过布局,与具体WebKit Ports的渲染接口,把渲染树渲染输出到屏幕上,成为了最终呈现在用户面前的Web页面。

JSCore

JSCore是WebKit默认内嵌的JS引擎,解释执行JS脚本。
从上面的渲染流程图我们可以看到,JS和DOM树之间存在着互相关联,这是因为浏览器中的JS脚本最主要的功能就是操作DOM树,并与之交互。同样的,我们也通过一张图看下它的工作流程:

JSCore值得注意的Feature

1、基于寄存器的指令集结构

2、单线程机制

整个JS代码是执行在一条线程里的,JS代码本身并不存在多线程处理任务的能力。
但是为什么JS也存在多线程异步呢?强大的事件驱动机制,是让JS也可以进行多线程处理的关键。

3、事件驱动机制

比如浏览器检测到发生了用户点击,会传递一个点击事件通知JS线程去处理这个事件

JS也进行异步编程,简单来讲就是遇到耗时任务时,JS可以把这个任务丢给一个由JS宿主提供的工作线程(WebWorker)去处理。
等工作线程处理完之后,会发送一个message让JS线程知道这个任务已经被执行完了,并在JS线程上去执行相应的事件处理程序。

JS线程和工作线程,以及浏览器事件之间的通信机制叫做事件循环(EventLoop),它有两个概念,一个是Call Stack,一个是Task Queue。
xy:call stack执行js线程的任务,task queue是工作线程的任务(放的是回调)


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.