浏览器对于前端开发人员的作用:
浏览器作为最重要的开发环境,是前端开发人员必须掌握的基础知识点,它贯穿着前端的整个网络体系。对浏览器原理的了解,决定着编写前端代码性能的上限。
现在浏览器结构:
用户界面(The User Interface) 浏览器引擎(The Browser Engine) 呈现引擎(The Rendering Engine) 网络(The Networking) JavaScript 解释器(The JavaScript Interpreter) 用户界面后端(The UI Backend) 数据存储(The Data Storage)
浏览器进程:
浏览器是一个多进程的架构,当我们每开一个新页面,就会开一个新的进程,所以如果一个页面崩溃也不会影响到别的页面 浏览器进程有如下几部分:主进程,第三方插件进程,GPU进程,渲染进程。 而渲染进程又包含了很多线程:js引擎线程,事件触发线程,定时器触发线程,异步http请求线程,GUI渲染线程。
主进程:
负责页面的显示与交互,各个页面的管理,创建和销毁其他进程。网络的资源管理和下载。
GPU进程:
最多有一个,3d绘制等。
插件进程:
每种类型的插件对应一个进程。
渲染进程:
称为浏览器渲染或浏览器内核,内部是多线程的;主要负责页面渲染,脚本执行,事件处
GUI渲染线程:
- 负责渲染浏览器界面,解析html,css,构建dom树和render树,布局和绘制。
- 当重绘和回流的时候就会执行这个线程
- GUI渲染线程和js引擎线程互斥,当js引擎执行时,GUI线程就会被挂起(相当于冻结了),GUI更新会被保存在一个队列中等到js引擎空闲时立即执行
js引擎线程:
- 也称js内核,负责处理js脚本程序,例如v8引擎
- 负责解析js脚本,运行代码
- 等待任务队列中的任务,一个tab页只有一个js进程
- 因为与GUI渲染线程互斥,所以js执行过长时间,就会造成页面渲染不连贯,导致页面渲染阻塞
事件触发线程:
- 归属于浏览器而不是js引擎,用了控制事件循环
- 当js引擎执行settimeout类似的代码块时,会将对应任务添加到事件线程
- 当对应的事件符合触发条件时,会被放到任务队列的队尾,等待js引擎线程处理
- 由于js单线程的关系,这些等待处理的事件都需要排队等待js引擎处理