生命周期
一道前端面试题
从浏览器地址栏输入url后,到页面渲染出来,整个过程发生了什么。
这个问题可以回答的非常细致,我们可以从几个方面入手,再来细分
- 浏览器接收到url,到url请求开启线程(进程与线程)
- 一个完整的http请求并发出(解析并建立请求)
- 服务器接收到请求并转交给具体的后台处理(前后端交互)
- 前后端之间的http交互和涉及到的缓存机制
- 浏览器接收到数据包后的关键路径渲染
- js引擎解析过程
网络请求线程开启
首先对url进行解析,如果是http协议,则浏览器开新建一个网络请求线程 去下载所需的资源。
这里注意一下线程和进程的区别。进程是沙箱隔离的,而进程中的线程是共享同一个进程的数据,进程间的通讯通过 IPC 机制
在chrome没出现以前,所有的浏览器都是单进程的,这时候一个页面死了,整个浏览器就block了。自从chrome出现后,就都是多进程的浏览器了。
主要分为以下几个进程
浏览器主进程 一个浏览器只有一个主进程,主要负责菜单栏,标题栏显示,文件访问,前进后退,子进程管理等 渲染进程(沙箱模式)默认回味每个标签窗口页开启一个独立渲染的进程,其中包括多个子线程,js引擎,gui渲染,事件触发,定时器触发 插件进程(沙箱模式)主要为了安全,让恶意脚本无法读取敏感数据 GPU进程 为了实现3d效果的css引入,所以每次问到如何开启gpu,只要开启css的3d效果就行了 网络进程 负责网络资源的加载
建立http请求
这个阶段主要分为两个部分
- 首先发起请求的客户端浏览器要明确知道所要访问的服务器地址
- 然后尽力通过该服务器地址的路径
dns 解析
dns解析非常耗时,所以在浏览器,本机本地都做了dns的缓存,以快速的获取相应 下面这张图可以很好的说明解析过程
tcp连接
tcp连接的关键点就在于三次握手和4次挥手。
握手
- 请求建立连接
- 服务端接收到请求连接数据包后,重整数据包返回给客户端作为确认
- 客户端队确认进行应答
挥手
- 客户端发出请求断开连接的数据包
- 服务端告知客户端已收到,但是因为数据可能未接收完成,客户端继续等待
- 服务端已完成所有数据的接收,则发送一个确认关闭的数据包
- 客户端进行关闭操作,并再次发送一个确认的数据包,告知我这边已经关闭,这时候服务端才会真正关闭
反向代理
当建立好tcp连接后,前后端就能进行通信了,但是往往之间会加入反向代理。因为一个应用是很复杂的,服务端往往会有多个服务来支持整个系统,这时候就会有一个统一的反向代理服务器来做负载均衡的操作。反向代理服务器的作用
- 负载均衡
- 安全防火墙
- 加密及ssl加速
- 数据压缩
- 解决跨域
- 对静态资源的缓存
常用的有nginx、iis、apache
http协议
http经过几次发展,从1.0 -> 1.1 -> 2.0,进行了长连接,多路复用,压缩报文等改进。后面会详细论述
浏览器缓存
在基于网络的前后端交互过程中,使用缓存能有效提高性能。具体的缓存策略分为,强缓存和协商缓存
生成页面
当从服务器拿到页面之后,浏览器会解析html和css,通过渲染进程来构建 DOM对象模型和cssOM,然后将两个模型合并为渲染树,最终生成为html