Web性能优化-浏览器工作原理-MDN文档学习笔记

浏览器工作原理

查看更多学习笔记:GitHub:LoveEmiliaForever
MDN中文官网

导航

导航是加载 web 页面的第一步:输入 URL、点击一个链接、提交表单等等

DNS查询

导航的第一步是要去寻找页面资源的位置
例如访问https://example.com,如果以前没有访问过它,则要向名称服务器发起DNS查询

DNS查询的目的是期望得到网址所对应服务器的IP地址
第一次请求之后,这个 IP 地址可能会被缓存一段时间

通过主机名加载一个页面通常仅需要一次 DNS 查询
但是,如果你的页面里面有多个不同的网址,例如网络字体网络图像广告等的请求地址分别是不同的网址,那么就要进行多次DNS查询

DNS 查询可能存在性能问题,特别是对于移动网络
移动网络中每一个 DNS 查询必须从手机发送到基站,然后到达一个认证的 DNS 服务器
这是一个比较大的等待时间

TCP握手

一旦获取到服务器 IP 地址,浏览器就会通过 TCP三次握手与服务器建立连接
通过 TCP 首先发送了三个消息进行协商,然后在两台电脑之间开始一个 TCP会话
这意味着终端与每台服务器之间还要来回发送三条消息,而请求尚未发出

TLS协商

对于通过 HTTPS 建立的安全连接,还需要另一次握手,即TLS协商
它会决定使用哪种密码对通信进行加密,验证服务器,并在开始实际数据传输前建立安全连接
这一过程需要在实际发送内容请求之前进行,再往返服务器五次

在这里插入图片描述

响应

建立了和服务器的连接后,浏览器将自动发送一个HTTP GET 请求,以请求初始文件
首字节时间TTFB是用户通过点击链接进行请求与收到第一个 HTML 数据包之间的时间
第一个内容分块通常是 14KB 的数据

拥塞控制/TCP慢启动

TCP 数据包在传输过程中被分成若干段,由于 TCP 保证数据包的顺序,因此服务器在发送一定数量的数据包后,必须以 ACK 数据包的形式收到客户端的确认

  • 如果服务器在每个网段后都等待 ACK,则会导致客户端频繁发出 ACK
  • 如果客户端无法接收到网段,不停地回应 ACK,服务器将一直重新发送网段

为了找到最合适的网段包含数据量,TCP 慢启动算法会逐渐增加传输数据量,直到确定最大网络带宽,往后它还将根据网络负载进行动态调整

传输段的数量由拥塞窗口CWND 的值控制,该值可初始化为 1、2、4 或 10 MSS(以太网中MSS为1500 bytes),客户端收到后必须发送 ACK,如ACK正常,则CWND翻倍,如异常,CWND减半

解析

解析是浏览器将通过网络接收的数据转换为 DOM 和 CSSOM 的步骤
在浏览器收到数据的第一块时,它就可以开始解析收到的信息

即使请求页面的 HTML 大于初始的 14KB 数据包,浏览器也将开始解析并尝试根据其拥有的数据进行渲染,但最好在前 14KB 中包含浏览器开始渲染页面所需的所有内容
这 14KB 至少应包含页面模板(第一次渲染所需的 CSS 和 HTML)

构建DOM树

DOM 树描述了文档的内容,因此处理 HTML 标记并构造 DOM 树是第一步进行的,如果文档格式良好,则解析它会简单而快速,DOM 节点的数量越多,构建 DOM 树所需的时间就越长

当解析器发现非阻塞资源,例如一张图片,浏览器会请求这些资源并且继续解析
当遇到一个 CSS 文件时,解析也可以继续进行
但是对于<script>标签(特别是没有 async 或 defer)会阻塞渲染并停止 HTML 的解析

当 JavaScript 解析和执行顺序不重要时,可以添加 async 属性或 defer 属性,以减少阻塞
等待获取 CSS 不会阻塞 HTML,但是它会阻塞 JavaScript,因为JS通常会查改CSS

预加载扫描器

在构建DOM树时,构建程序会占用主线程,在此时,预加载扫描仪将解析现阶段可用的内容并请求高优先级资源,如 CSS、JavaScript 和 web 字体
如此,我们不必等到解析器找到对外部资源的引用来请求它,而是异步进行

构建CSSOM树

CSSOM和DOM相似,都是树,不过它们两是独立的数据结构
浏览器将 CSS 规则转换为可以理解和使用的样式映射,它会遍历CSS规则,并创建节点树
浏览器会从节点的最通用规则开始,通过应用更具体的规则递归地优化计算的样式
构建 CSSOM 非常快,它甚至小于一次DNS查询的时间

JS编译

JS 会被解析、编译、解释

  • 脚本被解析为抽象语法树
  • 将抽象语法树输入编译器,输出字节码即进行编译
  • 解释时,大部分代码在主线程上进行解释,但如多线程worker的代码例外

渲染

渲染步骤包括样式、布局、绘制,在某些情况下还包括合成
CSSOM 树和 DOM 树组合成渲染树,用于计算每个可见元素的布局,将其绘制到屏幕上
某些情况下,可以将内容提升到它们自己的层并进行合成,通过在 GPU 而不是 CPU 上绘制屏幕的一部分来提高性能,从而释放主线程

样式

计算样式树或渲染树的构建从 DOM 树的根开始,遍历每个可见节点
应用了 visibility: hidden 的节点会包含在渲染树中,因为它们会占用空间
而不可见和display:none的节点都不会被包含在渲染树中

每个可见节点都应用了 CSSOM 规则,渲染树包含所有可见节点的内容和计算样式,将所有相关样式与 DOM 树中的每个可见节点匹配起来,并根据 CSS 级联,确定每个节点的计算样式

布局

在渲染树上运行布局以计算每个节点的几何体
确定呈现树中所有节点的宽度、高度和位置,以及确定页面上每个对象的大小和位置

渲染树会标识显示哪些节点及其计算样式,但不标识每个节点的尺寸或位置
为了确定每个对象的确切大小和位置,浏览器会从根开始遍历渲染树

由于设备关系,会有很多不同的视区大小(如1080p和720p的屏幕就不一样)
考虑到视口大小,浏览器将确定屏幕上所有不同框的尺寸
以视口的大小为基础,布局通常从 body 开始,用每个元素的框模型属性排列所有 body 的子孙元素的尺寸,为不知道其尺寸的替换元素(例如图像)提供占位符空间

第一次确定节点的大小和位置称为布局,随后对节点大小和位置的重新计算称为回流
假设布局发生在返回图像之前,一旦知道图像的尺寸,就会出现回流

绘制

在绘制或光栅化阶段,浏览器将在布局阶段计算的每个框转换为屏幕上的实际像素
绘画包括将元素的每个可视部分绘制到屏幕上,浏览器会非常快速的完成此项工作

为保障质量,浏览器通常以60Hz的速度绘制

绘制可以将布局中的元素分解为多个层,有一些特定的属性和元素可以实例化一个层(<video><canvas>、css属性有opacity3d transformwill-change的元素)
分层可以提高性能,但它是以内存管理为代价的,因此不应过度使用

合成

当文档的各个部分以不同的层绘制,相互重叠时,必须进行合成,以确保它们以正确的顺序绘制到屏幕上,并正确显示内容
回流会触发重新绘制和重新合成

交互

可交互时间TTI是测量从第一个请求导致 DNS 查询和 SSL 连接到页面可交互时所用的时间
可交互是 First Contentful Pain1 之后的时间点,页面在 50ms 内响应用户的交互
如果主线程正在解析、编译和执行 JavaScript,则JS不可用,因此无法及时(小于 50ms)响应用户交互


  1. 首次内容绘制,浏览器首次渲染任何可见元素 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决DNS解析错误故障

DNS解析错误会导致将一个域名解析为错误的IP地址&#xff0c;或者根本无法确定某个域名对应的IP地址&#xff0c;从而无法通过域名访问相应的站点&#xff0c;形成DNS解析故障。最常见的症状是访问站点对应的IP地址没有问题&#xff0c;但访问其域名时却出现错误。 DNS解析异常…

qt-动画圆圈等待-LED数字

qt-动画圆圈等待-LED数字 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "LedNumber.h" #include <QLabel>LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent) {//设置默认宽高比setScale((float)0.6);//设置默认背景色se…

【深入了解TensorFlow】TensorFlow的安装与配置

【深入了解TensorFlow】TensorFlow的安装与配置 TensorFlow的安装与配置准备就绪:开始前的准备工作1. 确定您的硬件和操作系统2. 选择安装方式3. 创建虚拟环境(可选)安装TensorFlow使用pip安装使用conda安装从源代码编译安装配置TensorFlow导入TensorFlow模块检查安装是否成…

Oracle 表被删除或重命名后账户间的授权与同义词关系

Oracle 表被删除或重命名后账户间的授权与同义词关系 情景一、 当数据表删除后 数据表被删除后&#xff0c;同义词还是存在的&#xff0c;可以查看当前用户下查看同义词&#xff1a; -- 查看当前用户下的同义词 select * from user_synonyms但授权关系不在了&#xff0c;若重…

10 个 Linux 中超方便的 Bash 别名

1、 你有几次遇到需要解压 .tar 文件但无法记住所需的确切参数&#xff1f;别名可以帮助你&#xff01;只需将以下内容添加到 .bash_profile 中&#xff0c;然后使用 untar FileName 解压缩任何 .tar 文件。 alias untartar -zxvf 2、 下载文件时&#xff0c;如果出现问题想要…

websocket与Socket的区别

概念讲解 网络&#xff1a;通俗意义上&#xff0c;也就是连接两台计算器 五层网络模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层 应用层 (application layer)&#xff1a;直接为应用进程提供服务。应用层协议定义的是应用进程间通讯和交互的规则&#xff0c;不…

明明正常,却不停return

明明正常&#xff0c;却不停return if(!is); { return ; } 熬人

应急响应速查

最重要的&#xff1a;我是谁&#xff1f;我在哪&#xff1f;别人怎么进来的&#xff1f;我就是这个被挖矿被勒索的电脑。 分析项 &#xff1a; 一、了解大概的被入侵系统情况&#xff1a; 发现时间&#xff1f;怎么发现的&#xff1f;这台机器有没有人运维&#xff1f;平时还…

排序第三篇 直接插入排序

插入排序的基本思想是&#xff1a; 每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置&#xff0c; 直到全部记录插入完为止。 一 简介 插入排序可分为2类 本文介绍 直接插入排序 它的基本操作是&#xff1a; 假设待排充序的记录存储在数组 R[1……

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

JavaScript 数组、遍历

数组 多维数组&#xff1a;数组里面嵌套 一层数组为二维数组。一维数组的使用频率是最高的。 如果数组访问越界会返回undefined。 数组遍历 数组方法Array.isArray() 这个方法可以去判定一个内容是否是数组。

AndroidStudio 2024-2-21 Win10/11最新安装配置(Kotlin快速构建配置,gradle镜像源)

AndroidStudio 2024 Win10/11最新安装配置 教程目的&#xff1a; (从安装到卸载) &#xff0c;针对Kotlin开发配置&#xff0c;gradle-8.2-src/bin下载慢&#xff0c;以及Kotlin构建慢的解决 好久没玩AS了,下载发现装个AS很麻烦,就觉得有必要出个教程了(就是记录一下:嘻嘻) 因…

把一个对象变成可迭代对象的两种方法,使用Symbol.iterator 和生成器Generator

方法一&#xff1a;自定义Symbol.iterator属性 如果对象拥有[Symbol.iterator] 方法&#xff0c;改方法返回一个迭代器对象&#xff0c;就可以称之为可迭代对象&#xff0c;注意迭代器是一个有 next 方法的对象 步骤如下 实现一个Symbol.iterator 键值是一个函数&#xff0c;…

java 时间格式 YYYY 于yyyy的区别

java formatDate 时间时&#xff0c;经常需要输入格式比如 YYYYMMDD,yyyyMMdd 这两个是有区别的 具体每个参数可以看下面

igolang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

代码随想录算法训练营第40天| 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 完成 思路&#xff1a; dp数组存放正整数i拆分后的乘积最大值&#xff1b;i可以拆分为j和i-j&#xff0c;也可以是j和dp[i-j]。 代码 class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;// 推导i的拆分乘积最大值for (int i …

【js】无限虚拟列表的原理及实现

什么是虚拟列表 虚拟列表是长列表按需显示思路的一种实现&#xff0c;即虚拟列表是一种根据滚动容器元素的可视区域来渲染长列表数据中某一个部分数据的技术。 简而言之&#xff0c;虚拟列表指的就是「可视区域渲染」的列表。有三个概念需要了解一下&#xff1a; 视口容器元…

【linux】linux查看某个已经启动进程的环境变量及命令行信息 /proc/${pid}/environ cmdline

随便找一个进程 yeqiangyeqiang-MS-7B23:~$ ps aux | grep Vir yeqiang 3538 0.4 0.6 1797056 210332 ? Sl 08:38 0:06 /usr/lib/virtualbox/VirtualBox 查看命令行 yeqiangyeqiang-MS-7B23:~$ strings /proc/3538/cmdline /usr/lib/virtualbox/VirtualBox …

Swift基础知识:17.Swift结构体

在 Swift 中&#xff0c;结构体&#xff08;Structures&#xff09;是一种用来封装一组相关的数据和功能的数据类型。结构体是一种值类型&#xff0c;它在传递和赋值时会被复制&#xff0c;与类&#xff08;Class&#xff09;不同&#xff0c;类是引用类型&#xff0c;它在传递…

python专业版破解激活(超详细)

python专业版破解激活 1.下载pycharm应用程序 这里我使用的版本是pycharm-professional-2023.3.2 下载pycharm程序的连接为&#xff1a; 百度网盘 请输入提取码 提取码为&#xff1a;nym0 2.安装 选择安装路径 下一步 这里全选 下一步 这里直接点击安装就可&#xff0c;其…