这是一道经典的面试题,题目出的非常宽泛,一般会作为一场面试的开场白式的题目出现,因为从这道题目能够展开太多内容。那么这个面试题也从这个题目开始,逐步展开进行复习吧。如果你也正好需要进行系统的回顾前端基础知识,那么请和我一起吧。
我们将这个过程分为三个阶段
graph LR
本地处理 --> 网络请求 --> 页面渲染
本地处理是指浏览器处理用户输入,准备请求数据;网络请求阶段就是从浏览器发起网络请求到服务器返回请求内容这个阶段;页面渲染就是浏览器将网络请求得到的数据进行返回的阶段。
现在,我们进入正题,逐阶段理解这三个过程。
本地处理
首先需要声明的是,我们这里的分析也都是基于chrome浏览器进行分析的,不同浏览器的处理机制可能不一致,但是通常我们说的现代浏览器是以chrome为代表。
我们假设小伙伴们都知道线程、进程、并行,同时知道chrome是多进程的浏览器。基于以上假设,我们介绍下浏览器的现代浏览器的五大进程,分别是:
- 浏览器进程:负责页面展示,用户交互,子进程管理以及存储。
- 渲染进程:负责将前端代码展示成用户看见的网页,这里有我们熟悉的排版引擎Blink和JavaScript引擎V8。
- CPU进程:页面祯的绘制,我们可以理解成页面是一副一副图片,由浏览器一遍一遍绘制在显示器上。有人提出用canvas重构页面的渲染方式,其实主要就是在这个地方做功。
- 网络进程:主要负责页面的网络加载。
- 插件进程:主要负责插件的运行,避免插件的崩溃引起浏览器整体崩溃。
虽然浏览器的架构也在不断的升级,但是到目前为止,这一套模型还是能解释通浏览器运行的原理的,我们就先这个理解吧。
好了,有了上面内容的了解,我们就已经能够大概知道用户回车之时,浏览器本地大概处理的流程是什么了。
忽略一些更细节的内容,当用户在地址栏按下回车键后,浏览器首先会给用户一个反悔的机会,通过js可以设置一个API,beforeunload,来进行离开确认。
如果这个API没有被定义或者用户确认离开,浏览器进程会将用户的输入处理成URL。浏览器进程接下来会把URL通过进程间通信发送给网络进程,接下来就进入到了网络阶段。
网络请求阶段
这个过程非常复杂,我一时间竟然不知道该怎么写起😂。TCP,HTTP,缓存,请求数据格式,状态码等内容。
梳理一下。首先,网络结构分为五层模型(不必抬杠,这里只是为了把我们的知识串联起来)。浏览器运行在应用层,HTTP协议也是应用层的协议,TCP/UDP是运输层的协议,再往底层还有IP协议所在的网络层,数据链路层和物理层。
但是我们现在所讨论的范围仅限前面两层。其次,为了更高效的响应用户请求,缓存肯定是充满了整个请求过程的每个阶段。
现在,我们可以试着去解释整个过程了。先看下图:
flowchart TD
解析URL --> 判断{强缓存没有过期}
判断{强缓存没有过期} --> 返回缓存资源 --> 浏览器进程准备渲染进程
subgraph http过程
判断{强缓存没有过期} --> DNS -->|IP地址| TCP[TCP链接]-->构建请求-->发起请求-->服务器返回信息
end
服务器返回信息 --> 解析响应头 --> 301/302{重定向标志}-->http过程
301/302{重定向标志}--> 处理响应结果 --> 浏览器进程准备渲染进程
浏览器进程准备渲染进程 --> 浏览器进程接受到网络进程提供的响应头 --> 向渲染进程提交文档 --> 渲染进程接受网络进程传送的网络数据 --> 渲染进程与浏览器进程确认提交 --> 更新浏览器界面状态
上述过程结束之后,页面就进入到渲染阶段。
页面渲染
接下来,渲染进程中的渲染引擎就会开始工作。大概过程也是老生常谈,我们就直接用一幅图解释:
flowchart TD
htmlcssjs --> DOM --> 样式计算 -->布局树-->对特殊节点进行分层,即BFC-->图层绘制[生成绘制列表存储绘制指令]
subgraph 栅格化
图层绘制-->将页面分成小图块-->转为位图[把可视区域优先生成位图]
end
转为位图-->在内存中生成网页祯-->显示到显示器上
这里面还有一些细节,但是太细了,我们只能在以后遇到的时候,再将这篇文章拿出来对比着分析,现在,我们只要知道这个流程就很好了。
以上,就是对于文章标题问题的回答,里面可能有些细节的问题还可以继续追问,以后我们会慢慢丰富。