当我们输入URL回车后发生了什么呢?接下来我们来简单的看看。
1、URL解析:主要有地址解析(合法、编码、内容判断) 、 HSTS 、 访问限制操作、安全检查操作、缓存检查操作等。
2、DNS查询 : 浏览器缓存——> 操作系统缓存——>路由器缓存——>ISP DNS 缓存 ——> 根域名服务器查询。
3、TCP连接(四层封装)
简单三次握手:
客户端:服务端你在不在?
服务端:客户端我在,你要连接我吗?
客户端:是的,要链接。
接下来、 连接打通,开始请求、发送HTTP请求。
4、处理请求:HTTP解析(域名、路径、方法等)、重定向、URL重写等
5、浏览器接受响应:资源分析、根状态码做事、压缩问题、响应
6、渲染页面:
HTML解析
第一步:解码(UTF-8或者GB2312等等等)解析成HTML。
第二步:预解析(识别请求资源比如imges中SRC属性加入请求队列。)
第三步:并行操作:符号化,构建树、解标签、创DOM节点
CSS解析
第一步:从左到右解析选择器进行判断等
举例:div .p { } 判断P的父元素是不是div
渲染树
第一步:DOM树、CSS规则合并树、渲染树。
第二步:计算大小、级联、渲染阻塞
渲染阻塞:①浏览器遇到<script>标签DOM停止直至脚本加载完成。
②若JS依赖CSS,则等CSS Rules构建完成,再来执行script。
避免阻塞:CSS阻塞JS JS阻塞DOM
原则:CSS排在JavaScript资源前面
JS放在</body>前面(<HTML>底部)
其他方法:defer和async
第三步:布局与绘制(确定位置大小,调用paint()方法)
第四步:合并与渲染
第五步:reflow与repaint(回流与重绘)
第六步:JS编码执行
①语法分析:语法正确与否、分析变量声明,变量值等、解析抽象语法树(AST)、AST——>机器指令
②预编译、创建执行上下文、创建变量对象、作用于链、this指向等问题。
补充:JS三种运行环境:全局环境、函数环境、eval()。
③执行 JS线程(虽是单线程实际四个线程在工作) JS引擎线程 事件触发线程 定时器触发线程 HTTP异步请求线程
然后:宏任务——> 微任务——>宏任务(异步)
7、断开链接、TCP四次挥手。