02- 浏览器运行原理

news2025/5/20 18:06:51

文章目录

  • 1. 网页的解析过程
    • 浏览器内核
  • 2. 浏览器渲染流程
    • 2.1 解析html
    • 2.2 生成css规则
    • 2.3 构建render tree
    • 2.4 布局(Layout)
    • 2.5 绘制(Paint)
  • 3. 回流和重绘
    • 3.1 回流reflow
      • (1)理解:
      • (2)出现情况
    • 3.2 重绘repaint
      • (1)理解:
      • (2)出现情况
  • 3. 特殊解析composite合成 和性能优化
  • 4. defer和async属性
    • 4.1 defer
    • 4.2 async

注:整个JS高级专栏依托于coderwhy老师的课程,相关图片、代码均来自于其课程。

1. 网页的解析过程

输入地址 —> DNS解析 —> 服务器响应 —> 浏览器响应
一个网页URL从输入到浏览器中,到显示经历怎样的过程呢?
在这里插入图片描述

浏览器内核

常见的浏览器内核:
在这里插入图片描述
我们常说的浏览器内核指的是浏览器的排版引擎,也称之为页面渲染引擎样板引擎

2. 浏览器渲染流程

详细内容可看我的另一篇博客:
浏览器渲染原理
在这里插入图片描述

2.1 解析html

因为默认情况下服务器会给浏览器返回index…html文件,所以解析HTML是所有步骤的开始:
解析HTML,会构建DOM Tree:
在这里插入图片描述

2.2 生成css规则

浏览器在解析html时遇到 css 的<link>时会开启另外一个线程对css文件进行下载,这也就不会影响到dom tree的生成;
下载完css文件后就会对其进行解析,生成对应的cssom树。
在这里插入图片描述

2.3 构建render tree

当有了DOM TreeCSSOM Tree两部分之后,就可以结合来生成Render Tree了。
在这里插入图片描述

注意❗️

  1. link元素不会阻塞DOM Tree的构建,但是会阻塞Render Tree的构建,因为构建Render Tree需要对应的CSSOM Tree
  2. DOM TreeRender Tree并不是一一对应的,有些dom可能设置了display: none;,不会在Render Tree中出现。

2.4 布局(Layout)

布局是确定呈现树中所有节点的宽度、高度和位置信息

Render Tree形成之后,就可以对dom的style进行计算:

  1. emrem%等转换成px

2.5 绘制(Paint)

  • 在绘制阶段,浏览器将布局阶段计算的每个frame转为屏幕上实际的像素点;
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素(比如img)
    在这里插入图片描述

3. 回流和重绘

3.1 回流reflow

(1)理解:

  • 第一次确定节点的位置和大小叫做布局(Layout);
  • 之后对于节点大小以及位置等的计算叫做回流。

(2)出现情况

  1. DOM结构发生改变(添加新节点或者移除节点);
  2. 布局改变(修改了width、height、padding等值);
  3. 窗口resize(修改了窗口的尺寸);
  4. 调用getComputedStyle方法获取尺寸、位置信息;

3.2 重绘repaint

(1)理解:

  • 第一次渲染内容叫做绘制(Paint);
  • 之后重新渲染叫做重绘(repaint)。

(2)出现情况

  1. 修改背景色、边框颜色、文字颜色、模糊样式等
  2. 回流一定引起重绘,所以回流是很消耗性能的事情。

所以在开发中要尽量避免回流

  1. 修改样式时尽量一次性修改
    • 比如通过cssText修改,通过添加class修改。
  2. 尽量避免频繁的操作DOM
    • 我们可以在一个DocumentFragment(了解即可)或者是父元素中将要操作的DOM操作完成,在一次性的操作。
  3. 尽量避免通过getComputedStyle获取尺寸、位置等信息
  4. 对某些元素使用positionabsolutefixed
    • 这种操作并不是不会引起回流,而是相对来说开销较小,不会对其他元素造成影响。

3. 特殊解析composite合成 和性能优化

绘制的过程,浏览器会将布局后的元素绘制到多个合成图层中(这是浏览器的一种优化手段);

  • 默认情况下,标准流的元素会被绘制到同一个图层中;
  • 而某些特殊的属性,会单独创建一个新的合成层,并且新的图层可以使用GPU加速绘制(每个合成层都是单独进行渲染)

哪些属性可以形成新的合成层呢?下面是常见的一下属性:

  • 3D transforms
  • videocanvasiframe
  • opacity动画转换
  • position: fixed
  • will-cahnge:一个实验性的属性,提前告诉浏览器可能会发生哪些变化
  • animationtransition设置了opacitytransform

注❗️:
分层确实可以提高性能,但是它以内存管理为代价,因此不应作为web性能优化策略的一部分过度使用!

4. defer和async属性

首先来了解一下 script和页面解析的关系 !

前面我们已经知道了,浏览器在解析html时遇到<link>不会影响DOM Tree的构建,那遇到<script>呢?会影响吗?
答案是:会的!

  • 浏览器在遇到<script>时会先停止对DOM Tree构建,转而去下载、执行js脚本;
  • 只有js脚本执行完毕后,DOM Tree才能继续进行构建;

那这是为什么呢?

  • 因为js文件中可能存在对DOM的操作;
  • 若先构建DOM Tree,再执行js脚本,可能会造成严重的回流和重绘,影响页面性能。

但是这也会带来新的问题,特别是现在主流框架:

  • 目前主要流行的VueReact,脚本往往比html页面更"重",处理时间更长,
  • 也就是在js脚本执行结束前,页面可能出现空白

(有些浏览器可能对此做了优化,也就是在js脚本执行接受之前,先将已经构建的DOM Tree进行展示)
在这里插入图片描述

为了解决这个问题,<script>给我们提供了两个属性:deferasync

4.1 defer

  • defer会告诉浏览器不要等待脚本的下载,继续执行DOM Tree的构建
  • 脚本的下载有浏览器完成,不会影响DOM Tree的构建;
  • 若脚本先下载完,那它会等待DOM Tree构建完成,在DOMContentLoaded事件执行前执行defer中的代码

在这里插入图片描述
总结:

  1. defer不会影响DOM Tree的构建;
  2. deferDOM Tree已经构建完成,可进行对dom的操作;
  3. defer总是在DOMContentLoaded时间发出前执行;
  4. 另外,有多个defer会按照编写顺序执行;
  5. 从某种角度来说,defer会提高页面性能,并且推荐放在<head>中(提前下载js脚本);
  6. 注意:defer仅适用于外部脚本,对于<script>默认内容会被忽略。

4.2 async

  • asyncdefer相似,都能够让脚本不堵塞页面;
  • async是完全独立于浏览器的:
    • 浏览器页面不会因为script脚本而暂停DOM Tree的构建;
    • async脚本不能保证顺序执行脚本,它独立下载,独立运行,不会等待其他脚本;
    • async不一定在DOMContentLoaded时间执行前执行

总结:

  1. defer通常需要在文档解析后操作DOMjavascript代码,并且对多个script文件有顺序要求;
  2. async通常用于独立的脚本,对其他脚本,甚至DOM没有依赖的:

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

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

相关文章

移除链表元素数据结构oj题(力扣题206)

目录 题目描述&#xff1a; 题目解读&#xff08;分析&#xff09; 解决代码 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 题目解读&#xff08;分析&#…

OpenTelemetry 从入门到精通

快速入门 OpenTelemetry 是一个可观测性框架和工具包&#xff0c; 旨在创建和管理遥测数据&#xff0c;如链路、 指标和日志。 重要的是&#xff0c;OpenTelemetry 是供应商和工具无关的&#xff0c;这意味着它可以与各种可观测性后端一起使用&#xff0c; 包括 Jaeger 和 Pro…

【免杀】C2免杀技术(六)进程镂空(傀儡进程)

一、技术定位与核心思想 进程镂空&#xff08;Process Hollowing&#xff09;属于 MITRE ATT&CK 中 T1055.012 子技术&#xff1a;先创建一个合法进程并挂起&#xff0c;随后把其主模块从内存“掏空”并替换为恶意映像&#xff0c;最后恢复线程执行&#xff0c;从而让…

Eclipse Java 开发调优:如何让 Eclipse 运行更快?

Eclipse Java 开发调优&#xff1a;如何让 Eclipse 运行更快&#xff1f; 在 Java 开发领域&#xff0c;Eclipse 是一款被广泛使用的集成开发环境&#xff08;IDE&#xff09;。然而&#xff0c;随着项目的日益庞大和复杂&#xff0c;Eclipse 的运行速度可能会逐渐变慢&#x…

彻底理解事件循环(Event Loop):从单线程到异步世界的桥梁

关于事件循环被问了很多次&#xff0c;也遇到过很多次&#xff0c;一直没有系统整理&#xff0c;网上搜的&#xff0c;基本明白但总感觉不够透彻&#xff0c;最后&#xff0c;自己动手&#xff0c;丰衣足食&#xff0c;哈哈 一、为什么需要事件循环&#xff1f;—— 单线程的困…

Linux(2)——shell原理及Linux中的权限

目录 一、shell的运行原理 二、Linux中权限的问题 1.权限的概念 2.如何进行用户的切换 1&#xff09;从普通用户切到超级用户 2&#xff09;从root用户切到普通用户 3.如何实现提权操作 4.如何将普通用户添加到信用列表&#xff08;sudoers&#xff09; ​编辑5.Lin…

如何在线免费压缩PDF文档?

PDF文件太大&#xff0c;通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢&#xff0c;主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 &#xff08;一&#xff09;iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…

汽车装配又又又升级,ethernetip转profinet进阶跃迁指南

1. 场景描述&#xff1a;汽车装配线中&#xff0c;使用EtherNet/IP协议的机器人与使用PROFINET协议的PLC进行数据交互。 2. 连接设备&#xff1a;EtherNet/IP机器人控制器&#xff08;如ABB、FANUC&#xff09;与PROFINET PLC&#xff08;如西门子S7-1500&#xff09;。 3. 连…

css:无限滚动波浪线

以上是需要实现的效果&#xff0c;一条无限滚动波浪线&#xff0c;可以用来做区块的分割线。 要形成上下交替的圆形&#xff0c;思路是给div加圆角边框&#xff0c;第一个只有上边框&#xff0c;第二个只有下边框。 循环了100个div&#xff0c;这个数量根据自己容器宽度调整&…

w~自动驾驶~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…

山东大学计算机图形学期末复习整理5——CG10上

CG10上 Frenet-Serret框架 空间中一条曲线可以写成参数形式&#xff1a; C ( u ) ( x ( u ) , y ( u ) , z ( u ) ) \mathbf{C}(u) (x(u), y(u), z(u)) C(u)(x(u),y(u),z(u)) 这表示&#xff1a;当参数 u u u 变化时&#xff0c;曲线在三维空间中移动&#xff0c;生成一条轨…

STM32移植LVGL8.3 (保姆级图文教程)

目录 前言设备清单2.8寸TFT-LCD屏原理与应用1️⃣基本参数2️⃣引脚说明3️⃣程序移植4️⃣硬件接线 LVGL8.3 移植流程1️⃣硬件及平台要求2️⃣版本说明3️⃣源码下载4️⃣源码移植 工程配置修改配置文件1️⃣lvgl_config.h2️⃣适配屏幕驱动3️⃣配置输入设备(触摸功能) 提供…

虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系

虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系1.Default Pawn与Camera的关系1.1. Default Pawn 是什么&#xff1f;1.2. Default Pawn 的主要组件1.3. Default…

C++多态的详细讲解

【本节目标】 1. 多态的概念 2. 多态的定义及实现 3. 抽象类 4. 多态的原理 5. 单继承和多继承关系中的虚函数表 前言 需要声明的&#xff0c;本博客中的代码及解释都是在 vs2013 下的 x86 程序中&#xff0c;涉及的指针都是 4bytes 。 如果要其他平台下&#xff0c;部…

vue项目启动报错

vue项目启动报错 一、问题二、解决 一、问题 从vue2更换到vue3之后&#xff0c;需要将node进行版本升级&#xff0c;之后启动项目出现了下面的问题。 Uncaught Error: A route named “PageNotFound” has been added as a child of a route with the same name. Route names …

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具&#xff0c;解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;提供智能SQL审核、查询重写优化及自动化巡检功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…

Tomcat多应用部署与静态资源路径问题全解指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等

前言 又到熟悉的前言&#xff0c;接到个需求&#xff0c;要引入高德地图api&#xff0c;我就记录一下&#xff0c;要是有帮助记得点赞、收藏、关注&#x1f601;。 后续有时间会慢慢完善一些文章&#xff1a;&#xff08;画饼时间&#xff09; map组件自定义气泡、mark标记点…

排序算法之线性时间排序:计数排序,基数排序,桶排序详解

排序算法之线性时间排序&#xff1a;计数排序、基数排序、桶排序详解 前言一、计数排序&#xff08;Counting Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析1.4 适用场景 二、基数排序&#xff08;Radix Sort&#xff09;2.1 算法原理2…