# html 相关
# 1. 浏览器
浏览器可以分为两部分,shell 和 内核。
- shell:是指浏览器的外壳,例如菜单,工具栏等。
- 内核:才是浏览器的核心。内核是基于标记语言显示内容的程序或模块,浏览器内核又可以分成两部分,
- 2.1 渲染引擎:渲染页面,Trident(IE)、Gecko(Firefox)、 Presto(Opera)、Webkit(Safari)
- 2.2 JS 引擎:解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果
# 2. 浏览器的渲染原理
- html 文档--》DOM 树
- Css 样式--》cssom 规则树
- DOM 树+cssom 规则树--》渲染树,渲染树的节点为渲染对象,对应关系非一对一(不可以见的 dom 节点)
- 根据渲染树来进行布局(回流,自动重排)
- 布局结束后,就是绘制阶段
- 其他:
- js 文件不仅会阻塞 dom 的构建,还会导致 cssom 阻塞 dom 的构建
- 重绘:dom 节点更新属性,只是更新外观和风格,不会影响布局
- 回流:改变了元素的尺寸,布局,需要重新构建,回流必定会发生重绘,重绘不一定会引发回流
- 操作 dom 慢:dom 是渲染引擎,js 是 js 引擎,其实这个操作涉及到了两个线程之间的通信,那么势必会带来一些性能上的损耗。
# 3. 浏览器内多标签之间的通信
实现多个标签页之间的通信,本质上都是通过中介者模式来实现的。因为标签页之间没有办法直接通信,因此我们可以找一个中介者, 让标签页和中介者进行通信,然后让这个中介者来进行消息的转发。
# 4. js 进程,线程,宏任务,微任务
# 概念
- 进程:是 cpu 资源分配的最小单位(是能拥有资源和独立运行的最小单位)
- 线程: 是 cpu 调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)
- GUI 渲染线程与 js 引擎线程是互斥的,当 JS 引擎线程执行时 GUI 渲染线程会被挂起,GUI 更新则会被保存在一个队列中等待 JS 引擎线程空闲时立即被执行。
# 浏览器渲染进程
GUI 渲染线程
- 负责渲染页面,布局和绘制
- 页面需要重绘和回流时,该线程就会执行
- 与 js 引擎线程互斥,防止渲染结果不可预期
JS 引擎线程
- 负责处理解析和执行 javascript 脚本程序
- 只有一个 JS 引擎线程(单线程)
- 与 GUI 渲染线程互斥,防止渲染结果不可预期
事件触发线程
- 用来控制事件循环(鼠标点击、setTimeout、ajax 等)
- 当事件满足触发条件时,将事件放入到 JS 引擎所在的执行队列中
定时触发器线程
- setInterval 与 setTimeout 所在的线程
- 定时任务并不是由 JS 引擎计时的,是由定时触发线程来计时的 计时完毕后,通知事件触发线程
异步 http 请求线程
- 浏览器有一个单独的线程用于处理 AJAX 请求 当请求完成时,若有回调函数,通知事件触发线程
# 宏任务和微任务的执行
- 宏任务:由于 JS 引擎线程和 GUI 渲染线程是互斥的关系,浏览器为了能够使宏任务和 DOM 任务有序的进行,会在一个宏任务执行结果后,在下一个宏任务执行前,GUI 渲染线程开始工作,对页面进行渲染。
// 宏任务-->渲染-->宏任务-->渲染-->渲染...
// setTimeout,setInterval等
- 微任务: 微任务可以理解成在当前宏任务执行后立即执行的任务,当宏任务执行完,会在渲染前,将执行期间所产生的所有微任务都执行完
// 宏任务-->微任务-->渲染-->宏任务-->微任务-->渲染-->渲染...
//Promise,process.nextTick
# 线程参考链接
← css样式 javascript基础 →