开发
web-frontend
js-runtime
browser
Browser

浏览器

进程

每开启一个软件,就会启动一个进程,这个进程会监听一个端口

线程

一个进程开启,他可能会启动多个线程

浏览器架构演变

  • 单进程架构
  • 多进程架构
  • 面向服务架构

多进程模型

  • 主进程
  • 渲染进程 每开启一个tab页面就会开启一个渲染进程
  • GPU进程
  • 网络进程
  • Plugins进程
进程名进程作用
主进程主要负责页面展示逻辑、用户交互、子进程管理;包括地址栏、书签、前进、后退、收藏夹等
GPU进程负责UI绘制、包含整个浏览器的全部UI
网络进程网络服务进程、负责网络资源加载
渲染进程控制Tab内的所有内容,将HTML、CSS和JavaScript转换为用户可交互的网页
插件进程控制网站运行的插件、比如flash等
其他进程Storage、Network、Audio Service等

浏览器内核 (渲染进程)

  • Trident
  • Gecko
  • Webkit
  • Blink
  • Presto
内核浏览器JS引擎
TridentIE4-11JScript、Chakra
GeckoFirefoxSpiderMonkey
WebkitSafari、Chrome、Android浏览器JavaScriptCore
BlinkChrome、OperaV8
EdgeEdgeChakra
Trident+Webkit(Blink)国产浏览器,QQ、360、搜狗、UC等等都有都有

多线程模型(针对渲染进程)

  • GUI渲染主线程
  • js引擎线程
  • 事件触发线程
  • 定时器触发线程
  • 网络线程
线程功能
GUI渲染主线程负责渲染浏览器界面,解析HTML、CSS,构建DOM树、Render树,布局,绘制,和js引擎互斥
JS引擎线程负责解析JS脚本,运行JS程序,每个渲染进程下只有一个JS引擎线程。与GUI渲染主线程互斥,如果执行任务过长,会导致页面卡顿
定时器触发线程setTimeout、setInterval计时完毕后,将回调添加到事件队列,等待JS引擎执行
网络线程XHR、fetch发起请求后开启一个网络线程请求,如果设置了回调函数、在状态变更时候,将回调函数放入事件队列,等待JS引擎执行
事件触发线程宿主环境提供,用于控制事件循环,不断地从事件队列取出任务执行

GUI渲染引擎

CRP Critical rendering path 关键渲染路径

  • 解析HTML & CSS源码
    • 解析HTML --> XML解析器
    • 解析CSS --> CSS解析器
  • 构建DOM树 & CSSOM树
    • HTML --> DOM树
    • CSS --> CSSOM树
  • 构建Render树/Layout树
  • 布局 Layout
  • 分层 Layer
  • 绘制 Paint
  • 展示 Display

JS引擎

  • 解析JS源码 --> JS解析器
  • 转化成AST
  • 翻译成字节码
  • 解析执行字节码
    • JIT 转化成机器码
    • 直接执行机器码