面试题:从输入URL到渲染页面这之间都经历了什么?

从输入URL到渲染页面的流程示意图:

从图中可以看出,整个过程需要各个进程之间的配合,chrome浏览器使用的是多进程多线程模式,下面是各个进程的作用。

浏览器进程:浏览器进程主要负责用户交互、子进程管理和文件储存等功能。

网络进程:网络进程是面向渲染进程和浏览器进程等提供网络下载功能。

渲染进程:渲染进程的主要职责是把从网络下载的 HTML、JavaScript、CSS、图片等资源解析为 可以显示和交互的页面。因为渲染进程所有的内容都是通过网络获取的,会存在一些恶意代码利用浏览器漏洞对系统进行攻击,所以运行在渲染进程里面的代码是不被信任的。这也是为什么 Chrome 会让渲染进程运行在安全沙箱里,就是为了保证系统的安全。

下面是流程步骤:
      1、首先输入url并回车
      2、浏览器进程会检查url,组装协议,构成完整的url
      3、浏览器进程通过进程间的通信(IPC)把url请求发送给网络进程
      4、网络进程收到URL会检查本地缓存是否缓存了该请求的资源,如果有则会中断请求直接返回缓存资源
      5、如果没有,网络进程想web服务器发起http请求(网络请求),请求流程如下
            5.1 进行DNS解析,根据域名获取服务器ip地址
            5.2 利用ip地址和服务器建立tcp连接
            5.3 建立连接之后浏览器会构建请求行、请求头等信息并把Cookie等数据附加到请求头中
            5.4 然后向服务器发送请求信息
            5.5 服务器收到请求信息后,会根据请求信息生成响应数据(包括响应行、响应头和响应体的信息 ),并发送给网络进程
      6、网络进程解析响应流程如下
            6.1 检查状态码,如果是301或302则需要重定向,从响应头中Location字段中读取地址并 重新发送请求
            6.2 检查状态码,是200检查响应类型Content-Type,字段值是text/html返回的就是html格式,  并将响应头信息发送给浏览器进程
      7、准备渲染流程如下
            7.1 当浏览器进程收到网络进程的响应头数据之后,便向渲染进程发起"提交文档"的消息,html数据
            7.2 渲染进程接收的"提交文档"的消息后,会和网络进程建立传输数据的"管道",开始传输数据
             7.3 数据传输完毕后,会向浏览器进程发送"确认提交"的消息
             7.4 浏览器接收到消息后,会更新包括安全状态、地址栏的URL、前进后退的历史状态,并更新Web页面,进入渲染阶段
        8、渲染阶段    (地址栏等更新后,浏览器标题上的图标周围会一直转圈,就是渲染阶段)
         8.1 构建dom树:浏览器无法直接理解和使用HTML,所以需要将HTML转换为浏览器能够理解的结构就是dom树
         8.2 进行样式计算:当渲染引擎接收到CSS文本时,会执行一个转换操作,将CSS文本转换为浏览器可以理解的结构就是styleSheets
         8.3 样式标准化操作:得到浏览器理解的CSS结构,进行样式标准化操作,例如将em转化为px,字体粗细的bold加粗转换为700
         8.4 计算样式:样式标准化后计算出DOM数中每个节点的具体样式,在计算中需要遵守CSS的继承和层叠两个规则保存在ComputedStyle结构内
         8.5 布局阶段:有了DOM树和DOM数中元素的样式后,开始创建布局树,所有不可见的节点都没包含到布局树中
         8.6 布局计算:所有可见的元素构成完整的布局树后,计算布局树节点的坐标位置
         8.7 分层阶段:布局树完成后,类似ps的图层,如一些复杂的3D转换、页面滚动。渲染引擎需要为这些特定的节点生成专用的图层,并构成图层树
         8.8 图层绘制阶段:图层树构成完毕后,渲染引擎会把每一个图层的绘制拆分成很多小的绘制指令,然后把这些指令按顺序组成一个待绘制列表
         8.9 栅格化操作:将绘制列表从渲染进程的主线程发送给合成线程,合成线程会将图层划分为图块,然后合成线程会按照视口附近的图块,来优先生成位图,实际生成位图的操作是由栅格化来执行的,所谓栅格化就是指将图块转化为位图
        8.10 合成与显示阶段:所有图块被光栅化后,合成线程会生成一个绘制图块的命令——"DrawQuad",并将该命令提交给浏览器进程。浏览器进程里面有一个叫viz的组件,用来接收发过来的DrawQuad命令,然后根据命令将页面内容绘制到内存中,最后再将内存显示在屏幕上

至此一个页面就渲染完成了,以上就是从输入URL到渲染的全过程

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值