HTTP请求
完整的http解析过程: 对网址进行DNS解析(得到ip地址)-----》 建立TCP连接三次握手----》发送http请求----》服务器响应http请求返回响应结果----》浏览器得到资源文件
下一步渲染页面:
解析HTML文件,创建DOM树;解析CSS 创建CSSOM树
----->将CSS与DOM合并,形成render树 (构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件)
----->布局和绘制(重排与重绘):
重排:浏览器把各个dom元素放在它应有的位置 的过程就叫重排
重绘:页面要呈现的内容通通画到屏幕上(重排必将引起重绘,而重绘不一定会引起重排)
注:css的link写在前面 js的script写在后面
因为css加载是异步的,可以与DOM树同时进行,生成render树,再进行渲染,
而渲染CUI与js文件的加载是互斥的 ,js会影响界面的渲染,而且不要着急那么快加载js,因为它要等界面渲染完才用得上)
或者 :在标签上添加了 `async` 或 `defer` 等属性,浏览器会异步的加载和执行JS代码,而不会阻塞渲染
浏览器的运行机制
浏览器是多进程的,其中包含了:
1)GPU进程
2)第三方插件进程
3)浏览器渲染进程
4)Browser进程
浏览器渲染进程是多线程的,其中包括以下线程:
1)GUI渲染线程 ---> 界面渲染(JS引擎线程和GUI渲染现场是冲突的)
2)JS引擎线程 ---> JS处理
3)事件触发线程 ---> 事件处理
4)定时器线程 ---> 定时器处理
5)http异步请求线程 ----> 异步请求处理
在JS引擎线程中,可以分为同步和异步任务,其中:
1)同步任务全部通过主线程执行,形成 执行栈(函数调用形成了一个栈帧,子函数被一个一个加加进去)
2)异步任务通过事件触发线程或者定时器线程处理,形成 任务队列,异步又分macrotask(setInterval()
setTimeout()
) 和 microtask,先微后宏
3)当执行栈中的任务全部处理完成,主线程为空闲的时候,会从任务队列中提取任务到执行栈中执行。
context: 当我们调用一个方法的时候,js会生成一个与这个方法对应的执行环境(context),又叫执行上下文。这个执行环境中存在着这个方法的私有作用域,上层作用域的指向,方法的参数,这个作用域中定义的变量以及这个作用域的this对象。