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,一经查实,立即删除!

相关文章

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

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

websocket与Socket的区别

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

排序第三篇 直接插入排序

插入排序的基本思想是&#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很麻烦,就觉得有必要出个教程了(就是记录一下:嘻嘻) 因…

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…

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

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

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

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

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …

光伏气象站:实现自动化、高精度的气象监测

型号推荐&#xff1a;云境天合 TH-FGF9】光伏气象站是一种基于光伏技术的气象监测设备&#xff0c;它利用太阳能转化为电能&#xff0c;为气象站提供持续的电力供应&#xff0c;并实现自动化、高精度的气象监测。 光伏气象站的工作原理可以分为以下几个部分&#xff1a; 光伏发…

SpringCloud Nacos安装

1. Nacos的下载&#xff1a;下载的是1.4的版本。 2. Nacos的安装&#xff1a; startup.cmd -m standalone 以单机模式启动Nacos。 登录的账号密码 都是nacos。

Android LruCache源码分析

文章目录 Android LruCache源码分析概述LruCache和LinkedHashMap关系源码分析属性写入数据读取数据删除缓存 Android LruCache源码分析 概述 LruCache&#xff08;Least Recently Used Cache&#xff0c;最近最少使用缓存&#xff09;是 Android 中的一种缓存机制。 根据数据…

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

SpringCloud全家桶---常用微服务组件(1)

注册中心: *作用: 服务管理 Eureka(不推荐)[读音: 优瑞卡] Nacos(推荐) Zookeeper [读音: 如k波] Consul [读音:康寿] **注册中心的核心功能原理(nacos)** 服务注册: 当服务启动时,会通过rest接口请求的方式向Nacos注册自己的服务 服务心跳: NacosClient 会维护一个定时心跳持…

Sora背后的论文(1):使用 lstms 对视频展现进行无监督学习

之前那篇《Sora背后的32篇论文》发出后&#xff0c;大家都觉得不错&#xff0c;有很多小伙伴都开始啃论文了。 那么我就趁热打铁&#xff0c;把这32篇论文的通俗解读版贴一下。 从去年开始&#xff0c;我基本上形成了一个思维方式&#xff0c;任何事情做之前先看看 有没有好的…

个人博客系列-环境配置-gitee(2)

注册gitee账户 地址&#xff1a;https://gitee.com/ 此步骤省略 新建仓库 执行以下命令 即可 拉取代码 创建目录 mkdir myCode && cd myCode 登录gitee找到项目&#xff0c;点击克隆&#xff0c;拉取代码 连接远程仓库命令 git remote add origin 仓库地址http…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…