当前位置: 首页 > Web前端 > HTML

浏览器的工作原理与实践(一)——请求到渲染过程

时间:2023-04-02 14:10:35 HTML

本文是在极客时间李冰老师的课程中总结的,有兴趣的同学可以自行学习。浏览器包含的进程浏览器进程:界面展示、用户交互、子进程管理、存储等渲染进程:rendertree、V8引擎、(每个Tab是一个进程,在沙箱中获取数据可能会有问题)GPU进程:3D、css网络进程:网络资源加载插件进程:插件运行,崩溃不会影响浏览同一个渲染进程受服务器和页面影响:同一个站点(根域名,同一个协议),同一个浏览上下文组(A从B打开,window.opener证明)。noopener和noreferren断开连接。TCP/IPTCP互联网中的数据是通过数据包传输的,数据包在传输过程中容易丢失或出错。IP负责将数据包传送到目的主机。UDP负责将数据包传递给特定的应用程序。TCP在保证数据完整传输的同时,其连接可分为三个阶段:连接建立、数据传输和断开。TCP连接HTTP请求流程构造请求:方法,地址,http协议版本搜索缓存:如果有缓存,取浏览器缓存文件准备IP地址和端口号:域名系统DNS地址IP号,http内容是阶段通过TCP传输数据实现了等待TCP队列握手3次建立TCP连接:——>服务器发送请求:(请求行,请求头)post请求体服务器处理服务器响应:(回复响应行,响应header,replytext)协议版本状态码4挥手一次断开TCP请求DNS缓存浏览器本地缓存对应IP和域名。浏览器缓存服务器设置Cache-Control:Max-age=2000,如果缓存过期,会在请求头添加一个If-None-Match:...token。未过期304,过期重发,刷新缓存新鲜度。baidu.com——>https://baidu.com.301重定向,服务器处理跳转定位地址。从输入url到页面显示,经历过用户输入什么,判断输入的是url,地址栏会添加协议,合成一个完整的url。您可以监视beforeunload以确认提交表单url请求过程。浏览器进程通过进程间通信IPC将url请求发送给网络进程,网络进程会检查是否有本地缓存??。如果是,直接返回资源。如果没有请求,首先进行DNS解析,获取请求域名的服务器IP地址,如https,并建立TLS连接,然后使用该IP与服务器建立TCP连接。浏览器将请求行、请求头、cookie发送给服务器,服务器将生成响应数据发送给网络进程,并开始解析响应头的内容。(1)重定向:响应头的状态码为301或302,从响应头所在位置读取浏览器的重定向地址,然后发起http或https,从头开始。(2)响应数据类型处理:判断响应头的content-type,如果是application/octet-stream,则提交给下载管理器请求流程结束,如果是text/html页面rendering正在渲染过程中。准备渲染进程,每打开一个新页面,都会有一个新的渲染进程,但是根据域名和协议,同一个站点会共享一个渲染进程。渲染进程准备好后,将文档提交给渲染进程(html数据)。提交确认后,会更新:前进后退状态、加载状态、地址栏url、网页、安全状态,然后进入渲染阶段。提交文档,浏览器进程将网络进程接收到的HTML数据提交给渲染进程,然后更新浏览器界面状态,包括安全状态、地址栏的URL、前进后退历史状态,并更新网页渲染阶段,Page解析和子资源加载渲染过程浏览器无法理解和使用html,所以需要解析转换成DOM树,在控制台输入document可以看到完整的DOM树。它会将css转换成styleSheets,控制台document.styleSheets可以看到样式表。该结构体具有查询和修改的功能。标准化css属性值的目的是获取DOM树的几何位置。还需要创建一个布局树:遍历所有可见的节点并添加到布局树中,忽略不可见的元素。对于页面上的一些复制效果,比如z轴排序的3D变换z-index,渲染引擎也需要为其生成一个layertree。有定位属性,透明度属性,cssfilters等,堆叠上下文会提升为单层。创建层也需要裁剪(滚动),合成线程根据视口附近的块生成的位图进行光栅化操作。光栅化过程将由GPU加速并使用GPU线程。重绘:js改变背景色,不改变几何位置,布局阶段不改变,直接绘制执行,省去布局和分层,比重排更高效。重排:改变高度,触发重新布局,分析称为重排。完整的渲染过程需要更新,这是最昂贵的。合成:translate(),跳过布局和绘制,避免重排重绘,不在主线程直接合成动画,效率最高,css动画>js动画。