进程
一
CPU正在进行的一个任务的运行过程的调度单位
浏览器是一个多进程的应用程序
进程是计算机调度的基本单位
任务管理器(mac活动监视器)查看chrome的进程情况
每一个tab都会开启一个进程
浏览器有一个主进程(用户界面)
每一个tab各自有独立的渲染进程(浏览器内核Renderer,渲染引擎)、网络进程(网络请求)、GPU进程(动画与3D绘制)、插件进程(devtool)
每个进程里包含了多个线程运行
进程包含线程,线程在进程中运行
渲染进程
GUI渲染线程(渲染页面)
JS引擎线程
GUI渲染与JS引擎线程运行互斥
渲染进程 – GUI渲染线程
解析HTML、CSS
构建DOM/Render树
初始布局与绘制
重绘与回流
渲染进程 – JS引擎线程
JS内核线程
一个主线程与多个辅助线程配合
一个浏览器只有一个JS引擎
解析JS脚本
运行JS代码
渲染进程 – 宏任务与微任务
创建线程的目的是为了实现异步的执行条件
宏任务:宿主提供的异步方法和任务
script setTimeout UI渲染
微任务:语言标准(ECMA262)提供的API运行。
Promise MutationObserver
事件触发线程Event Loop
JS引擎线程执行栈同步代码宏任务异步代码执行完毕
微任务队列(清空)Promise.then、MutationObserver
GUI渲染宏任务队列(取出一个放入执行栈)Ajax、setTimeout、用户交互事件
宏任务和微任务
宏任务 MacroTask -> Max
script / UI渲染 / setTimeout / setInterval / setImmediate
setImmediate: IE新版本/Edge/NodeJS Node.js 0.10+
messageChannel / requestAnimationFrame / 用户交互事件 / ajax
循环执行setInterval就是设置一个时间间隔,每过一段时间都会执行一次这个方法,直到这个定时器被销毁掉
用法是setInterval(“方法名或方法”,“延时”), 第一个参数为方法名或者方法,注意为方法名的时候不要加括号,第二个参数为时间间隔
mounted () {
this.timer = setInterval(this.getCompany, 5000);
this.$once('hook:beforeDestroy', () => {
clearInterval(this.timer)
})
}
`定时执行setTimeout是设置一个时间,等待时间到达的时候只执行一次,但是执行完以后定时器还在,只是没有运行
用法是setTimeout(“方法名或方法”, “延时”); 第一个参数为方法名或者方法,注意为方法名的时候不要加括号,第二个参数为时间间隔
```javascript
setTimeout(() => {
this.$store.dispatch('user/handleLogOut').then(res => {
this.$router.push(`/login/user`)
})
},300)
handleReport() {
this.timer = setTimeout(() => {
this.matching = false
clearTimeout(this.timer)
this.$router.push({ name: 'result', params: this.resultData })
}, 1000)
}
this.$store.dispatch('company/detailStaffs').then(res => {
this.tableDataList = res
this.loading = false
setTimeout(() => {
this.handleSelectd()
},300)
})
微任务 MicroTask -> Min
promise.then / mutationObserver / process.nextTick