生命周期

一道前端面试题

从浏览器地址栏输入url后,到页面渲染出来,整个过程发生了什么。

这个问题可以回答的非常细致,我们可以从几个方面入手,再来细分

  1. 浏览器接收到url,到url请求开启线程(进程与线程)
  2. 一个完整的http请求并发出(解析并建立请求)
  3. 服务器接收到请求并转交给具体的后台处理(前后端交互)
  4. 前后端之间的http交互和涉及到的缓存机制
  5. 浏览器接收到数据包后的关键路径渲染
  6. js引擎解析过程

网络请求线程开启

首先对url进行解析,如果是http协议,则浏览器开新建一个网络请求线程 去下载所需的资源。

这里注意一下线程和进程的区别。进程是沙箱隔离的,而进程中的线程是共享同一个进程的数据,进程间的通讯通过 IPC 机制

在chrome没出现以前,所有的浏览器都是单进程的,这时候一个页面死了,整个浏览器就block了。自从chrome出现后,就都是多进程的浏览器了。

主要分为以下几个进程

浏览器主进程 一个浏览器只有一个主进程,主要负责菜单栏,标题栏显示,文件访问,前进后退,子进程管理等 渲染进程(沙箱模式)默认回味每个标签窗口页开启一个独立渲染的进程,其中包括多个子线程,js引擎,gui渲染,事件触发,定时器触发 插件进程(沙箱模式)主要为了安全,让恶意脚本无法读取敏感数据 GPU进程 为了实现3d效果的css引入,所以每次问到如何开启gpu,只要开启css的3d效果就行了 网络进程 负责网络资源的加载

建立http请求

这个阶段主要分为两个部分

  1. 首先发起请求的客户端浏览器要明确知道所要访问的服务器地址
  2. 然后尽力通过该服务器地址的路径

dns 解析

dns解析非常耗时,所以在浏览器,本机本地都做了dns的缓存,以快速的获取相应 下面这张图可以很好的说明解析过程

dns解析

tcp连接

tcp连接的关键点就在于三次握手和4次挥手。

握手

  1. 请求建立连接
  2. 服务端接收到请求连接数据包后,重整数据包返回给客户端作为确认
  3. 客户端队确认进行应答

挥手

  1. 客户端发出请求断开连接的数据包
  2. 服务端告知客户端已收到,但是因为数据可能未接收完成,客户端继续等待
  3. 服务端已完成所有数据的接收,则发送一个确认关闭的数据包
  4. 客户端进行关闭操作,并再次发送一个确认的数据包,告知我这边已经关闭,这时候服务端才会真正关闭

反向代理

当建立好tcp连接后,前后端就能进行通信了,但是往往之间会加入反向代理。因为一个应用是很复杂的,服务端往往会有多个服务来支持整个系统,这时候就会有一个统一的反向代理服务器来做负载均衡的操作。反向代理服务器的作用

  • 负载均衡
  • 安全防火墙
  • 加密及ssl加速
  • 数据压缩
  • 解决跨域
  • 对静态资源的缓存

常用的有nginx、iis、apache

http协议

http经过几次发展,从1.0 -> 1.1 -> 2.0,进行了长连接,多路复用,压缩报文等改进。后面会详细论述

浏览器缓存

在基于网络的前后端交互过程中,使用缓存能有效提高性能。具体的缓存策略分为,强缓存和协商缓存

生成页面

当从服务器拿到页面之后,浏览器会解析html和css,通过渲染进程来构建 DOM对象模型和cssOM,然后将两个模型合并为渲染树,最终生成为html

Last Updated: