这块儿主要是大体上理解浏览器的工作流程,对于前端来说,其中渲染部分是最重要的.
进程和线程
稍微通俗点来描述它们,就是我一个系统要做一件事,比如造车,要装发动机、机身、轮胎等等子任务.我可以只安排一个人去做,那整个造成的进程就是只有一个线程.但是如果我安排多个人去做,那就是多个线程,而且这几个人可以完全独立且同时工作.这就是线程的并发.
浏览器的多进程架构
我们之前说过浏览器由七大部分组成,所以为了统筹这些部分.浏览器采用了多进程的架构.那么它的进程有
1.Browser进程
浏览器的主进程,也就是浏览器从打开到关闭都有参与.它主要是用户界面和浏览器引擎的参与.
2.渲染进程
这也是前端最需要关注的进程.主要参与页面的渲染.当然包含js部分.所以它需要浏览器的渲染引擎和js引擎参与
3.GPU进程
GPU为图形处理器,参与图形相关的渲染.可以在某些手机的开发者选项中看到"强制使用GPU渲染2D图片",就是那个GPU了.
4.插件进程
每用一个插件都会开启一个进程
其中Browser进程和GPU进程每个浏览器就一个,而渲染进程是每开一个页面都会开一个进程,以保证每个页面的渲染都是独立的,而插件进程则是每个页面都有相同数量的插件进程.比如你开了两个插件,两个页面,那就有四个插件进程,以保证每个页面的每个插件都能正常工作.
渲染进程
渲染进程包含以下线程:
1.GUI线程(主要负责解析HTML、CSS和渲染页面)
2.JS引擎线程(负责解析和执行JS代码)
3.事件线程(控制事件循环)
4.定时器线程(处理定时器相关逻辑)
5.异步请求线程(发起Ajax时会生成该线程)
结合这段内容,我们可以充分去理解以下的几个问题
(1)js为什么是单线程?
因为一个渲染进程只有一个js引擎线程,只有js引擎线程会解析js脚本.其目的是因为用户行为是不可控的,容易出现多线程操作同意dom导致出错的问题.
(2)html、css的解析和js的解析是同时进行的吗?
GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起,页面的更新操作会等到JS引擎空闲时执行.也就保证了js不再对页面元素进行修改之后再去解析渲染html和css.
(3)为什么会出现异步问题?
因为js引擎线程在发异步请求时并不会等待异步请求.因为一旦等待了,将会影响页面加载,请求出错甚至会导致页面崩溃,严重影响用户体验.