# 浏览器基础知识

# 浏览器进程分类

  • 浏览器主进程:协调、主控(浏览器界面显示,用户交互,其他进程的创建与销毁)
  • 第三方插件进程
  • GPU 进程
  • 浏览器渲染进程:页面渲染、脚本执行、事件处理
    • GUI 渲染线程
    • JS 引擎线程
    • 事件触发线程---控制事件循环
    • 定时器线程
    • 异步 HTTP 请求线程

# 线程关系

  • 浏览器设置GUI渲染线程与JS引擎为互斥的关系,当JS引擎执行时GUI线程会被挂起, GUI更新则会被保存在一个队列中等到JS引擎线程空闲时立即被执行。
  • DOM是属于渲染引擎中的东⻄,⽽JS⼜是JS引擎中的东⻄。当我们通过JS操作DOM的时候,就涉及到了两个线程之间的通信,那么势必会带来⼀些性能上的损耗。操作DOM次数⼀多,也就等同于⼀直在进⾏线程之间的通信,并且操作DOM可能还会带来重绘回流的情况,所以也就导致了性能上的问题。
  • 由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JS线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。
  • 单独的 iframe 会在单独的进程中运行

# script、style 是否阻塞 HTML 解析与渲染

  • style 阻塞 HTMl 的渲染,不阻塞解析
  • script,会阻碍 HTMl 的解析,下载好并执行完脚本才会继续解析
  • async script,解析的过程中,脚本异步下载,下载完立即执行,也会阻碍 HTML 的解析
  • defer script,不会阻碍 HTML 的解析,解析完再按照顺序执行脚本