这里简单说一种通过浏览器不同进程的角度来看这个问题的
浏览器进程:
• 用户输入内容,进行URL 解析(编码)
• 如果是文本,则拼接成默认搜索引擎加关键字的 URL 进行搜索
• 如果是 URL 就进行页面访问请求,并加上协议头(http、https 的区别)
网络进程:
• 查询缓存(缓存相关知识)
• 如果有浏览器本地缓存可用则使用本地缓存
• DNS 解析(DNS 相关)
• 通过 DNS 来查询 IP 地址
• DNS 先查本地、后查运营商、逐级网上查。(域名解析是从后往前查的)
• 拿到 IP 地址发起 HTTP 请求(这块可以问网络相关各种基础知识,TCP、IP、UDP、HTTPS、HTTP2)
• 建立 TCP 三次握手连接
• 如果是 HTTPS 建立 TLS 安全通道连接(HTTPS 加密方式)
• 发送 HTTP 请求,这个请求可能回到代理服务器或者源服务器。(服务器代理)
• 拿到 HTTP 响应(HTTP 响应码)
• 根据 Content-Type 来判断响应文件类型(常用 HTTP 响应头的作用)
• stream 类,浏览器启动下载界面下载文件。
• text、图片类,浏览器直接展示在页面上
• html 类型,浏览器会进行页面解析。
渲染进程:
• 页面解析
• 网络进程向渲染进程传输 HTML 数据
• 对 HTML 进行词法分析,通过堆栈算法构建 DOM 树。(AST语法树)
• 如果遇到外部资源,浏览器会交给网络进程去下载。
• 构建完 DOM 树的同时,将 CSS 代码转为浏览器可以理解的 StyleSheets
• 标准化样式属性值(单位、大小)
• 计算出 DOM 树每个节点的具体样式
• 计算每个 DOM 节点的父节点们的样式(样式继承)
• DOM 树构建完成后, 合并 StyleSheets 构建出 CSSOM 渲染树。
• 排版:遍历渲染树,计算元素的坐标位置。
• 分层:为节点生成图层
• 绘制:用浏览器指令逐条绘制页面元素。(如何避免重绘重排)
• 栅格化
• 合成