从输入url到页面渲染完成经历的那些事~

网络部分

1. DNS域名解析

第一个过程:将域名解析为对应的IP地址。

查找流程:浏览器缓存 -> 系统缓存 -> 系统hosts文件 -> 路由器缓存 -> 本地DNS服务器 -> 其它服务器

一旦找向其它服务器,则进入递归查找过程:顶级域名服务器 -> 二级域名服务器 -> 三级域名服务器 -> ...

从输入url到页面渲染完成经历的那些事~_第1张图片

2. 建立TCP连接

一旦找到了对应的服务器,则客户端与服务器通过TCP三次握手建立连接,以便传输数据。

  • 客户端 -> 服务器:你好,我想跟你连接可以吗?(SYN=1,seq=x)
  • 服务器 -> 客户端:可以,你确定要连接是吧?(SYN=1,ACK=1,seq=y,ack=x+1)
  • 客户端 -> 服务器:确定,我们连接吧!(ACK=1,seq=x+1,ack=y+1)

3. HTTP请求与响应

一旦建立了TCP连接,客户端与服务器之间就可以来传递数据了:由客户端发起HTTP请求,服务器端给到HTTP响应。

4. 断开TCP连接

传输数据完成后,通过四次挥手断开TCP连接:

  • 客户端 -> 服务器:好了,咱们断开吧(FIN=1,seq=u)
  • 服务器 -> 客户端:行,等我稍微检查一下还有没有要发你的数据(ACK=1,seq=v,ack=u+1)
  • 服务器 -> 客户端:可以了,咱们断开吧,拜拜(FIN=1,ACK=1,seq=w,ack=u+1)
  • 客户端 -> 服务器:好的,再会,拜拜(ACK=1,seq=u+1,ack=w+1)

浏览器部分

1. 浏览器解析文件

  • 解析HTML生成DOM树
  • 解析CSS生成CSSOM树
  • 解析JS

2. 构建render渲染树

根据CSSOM和DOM生成渲染树,渲染树中不包含display为none的元素

3. 绘制渲染树

  • 浏览器会对这些元素进行定位和布局,这一步也叫做reflow或者layout。
  • 浏览器绘制这些元素的样式,颜色,背景,大小及边框等,这一步也叫做repaint。
  • 在绘制阶段,浏览器会遍历渲染树,调用渲染器的paint()方法在屏幕上显示其内容。

 细节问题:

1. reflow回流与repaint重绘

参考链接:https://www.jianshu.com/p/b6b42fd3f80e

  • reflow(回流):当浏览器发现某个部分发生了变化从而影响了布局,这个时候就需要倒回去重新渲染,大家称这个回退的过程叫 reflow。 常见的reflow是一些会影响页面布局的操作,诸如Tab,隐藏等。reflow 会从 html 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置,以确认是渲染树的一部分发生变化还是整个渲染树。reflow几乎是无法避免的,因为只要用户进行交互操作,就势必会发生页面的一部分的重新渲染,且通常我们也无法预估浏览器到底会reflow哪一部分的代码,因为他们会相互影响。
  • repaint(重绘): repaint则是当我们改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸和位置没有发生改变。

需要注意的是,display:none 会触发 reflow,而visibility: hidden属性则并不算是不可见属性,它的语义是隐藏元素,但元素仍然占据着布局空间,它会被渲染成一个空框,这在我们上面有提到过。所以visibility:hidden 只会触发 repaint,因为没有发生位置变化。

2. 浏览器渲染的细节问题

参考链接:https://www.cnblogs.com/caizhenbo/p/6679478.html

                  https://www.cnblogs.com/zhmhhu/p/6250060.html

浏览器渲染原理:

当我们在浏览器地址输入URL时,浏览器会发送请求到服务器,服务器将请求的HTML文档发送回浏览器,浏览器将文档下载下来后,便开始从上到下解析,解析完成之后,会生成DOM。如果页面中有css,会根据css的内容形成CSSOM,然后DOM和CSSOM会生成一个渲染树,最后浏览器会根据渲染树的内容计算出各个节点在页面中的确切大小和位置,并将其绘制在浏览器上。浏览器遇到HTML文档中的

你可能感兴趣的:(前端,浏览器渲染)