Chrome浏览器原理及优化
1. 相关面试题
1.1. 请说说从输入 URL 到页面渲染完成的全过程
1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键;
2. DNS解析;
浏览器需要将域名转换为服务器的IP地址,以建立连接。
(1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,则直接获取;
(2). 否则,会向本地域名服务器发起DNS查询请求,通过递归查询的方式获得IP地址;
3. TCP链接;
浏览器与目标服务器之间使用三次握手建立TCP连接:
(1). SYN:浏览器发送SYN同步序号请求包,要求服务器建立连接;
(2). SYN-ACK:服务器收到SYN包后,回应SYN-ACK包;
(3). ACK:浏览器收到SYN-ACK包后,回复ACK确认包,完成连接;
4. TLS握手;
如果使用HTTPS,浏览器与服务器之间进行TLS握手,确保传输的安全性:
(1). 客户端问候:浏览器发送支持的加密套件列表和随机数;
(2). 服务器问候:服务器选择加密套件、返回公钥证书和随机数;
(3). 密钥生成:双方通过公钥证书和随机数生成会话密钥;
(4). 握手完成:双方使用生成的会话密钥加密通信;
5. 发送HTTP请求;
建立连接后,浏览器发送HTTP请求:
(1). 请求行:包括方法、路径、HTTP版本,如GET / HTTP/1.1;
(2). 请求头:携带相关头信息,如User-Agent、Accept-Language;
(3). 请求体:通常在POST请求中携带数据;
6. 服务器处理请求;
服务器接收到请求后:
(1). 根据URL和请求方法,确定处理逻辑;
(2). 可能需要查询数据库或调用其他API;
(3). 生成响应,包括响应行、响应头和响应体;
7. 返回HTTP响应;
服务器发送响应:
(1). 响应行:包括HTTP版本、状态码、状态描述,如HTTP/1.1 200 OK;
(2). 响应头:携带相关头信息,如Content-Type、Cache-Control;
(3). 响应体:通常是HTML、JSON、图片等内容;
8. 浏览器渲染页面;
浏览器开始渲染页面,主要经过以下阶段:
(1). 构建DOM树;
解析HTML文档,构建DOM树,遇到外部资源CSS、JavaScript或是图片时,根据属性决定是否同步或异步加载。
(2). 构建CSSOM树;
解析CSS文件和<style>标签,构建CSSOM树。
(3). 合成渲染树;
将DOM树和CSSOM树合并,生成渲染树,只包含可见元素。
(4). 布局计算;
确定每个元素的大小和位置,根据CSS盒模型进行布局。
(5). 绘制;
绘制每个元素的内容,包括文本、图像、背景等。
(6). 分层与合成;
渲染层分为多个图层,独立绘制并最终组合成完整页面。
9. 执行JavaScript
在页面渲染过程中或渲染完成后,浏览器执行JavaScript脚本:
(1). 阻塞脚本:在构建DOM时遇到<script>标签会暂停解析,直到脚本加载并执行完成;
(2). 异步脚本:async和defer属性可用于异步加载和执行脚本,不阻塞DOM解析;
10. 事件处理与交互
(1). 页面加载完成后,浏览器继续处理用户的交互操作;
(2). 根据事件绑定的处理函数,执行相应的JavaScript代码;
1.2. DOM和CSSOM的关系和影响
1. 描述DOM和CSSOM是如何分别构建的?
DOM是通过解析HTML文档来构建的,每个HTML标签都会变成DOM树中的一个节点。
CSSOM是通过解析CSS文件和<style>标签中的样式信息构建的,它反映了所有CSS规则和对应样式属性的层次结构。
2. 它们是如何相互影响,最终形成渲染树的?
当DOM和CSSOM均构建完成后,浏览器将它们合并成一个渲染树,该树只包括页面中实际需要渲染的元素及其样式信息。
3. 修改DOM或CSSOM中的元素对页面渲染有何影响?
修改DOM或CSSOM都可能引发重排和重绘,严重时会导致整个页面的重新渲染,影响性能,可以借助 transform3D调用GPU优化,减少重排。
1.3. 浏览器的重排与重绘怎么理解
1. 解释什么是重排和重绘?
重排是指浏览器为了重新计算页面布局而进行的过程,通常发生在添加或删除可见的DOM元素,或者元素尺寸改变的情况下。
重绘发生在元素的外观改变,但位置和尺寸未变的情况下,例如改变颜色、阴影等。
2. 提供哪些常见操作会触发重排和重绘?
常见触发重排的操作包括修改DOM结构、改变元素位置和尺寸,而改变颜色或背景图将触发重绘。
3. 如何优化代码以减少重排和重绘的影响?
优化方法包括使用CSS类进行样式变更而非直接操作样式属性,避免在循环中直接操作DOM,利用文档碎片或虚拟DOM来批量更新DOM,使用transform和opacity进行动画处理,因为这些属性可以由合成器处理。
1.4. 请说说浏览器的合成层
1. 什么是浏览器的合成层?
合成层是浏览器处理完重排和重绘后,将页面分割成多个层次,然后由合成器合成最终视觉输出的过程。每个层可以单独被GPU处理,以优化性能。
2. 为何某些CSS属性可以触发GPU加速?
CSS属性如transform和opacity可以触发GPU加速,因为它们不影响DOM的布局,而只是影响元素的外观和位置变换。GPU处理这类变换比CPU更高效,因为GPU专门设计来处理图形和视觉效果。
3. 如何通过开发者工具来识别和优化合成层的性能?
使用Chrome等浏览器的开发者工具的“Layers”面板可以查看页面的层信息。通过这些工具,开发者可以观察哪些元素被创建成单独的层,评估合成层的性能,并进行相应的优化,比如减少不必要的层,合并可以合并的层,或调整动画使用合适的属性来优化GPU处理。
2. 浏览器渲染过程详解
2.1. DNS 查询
对于一个 web 页面来说导航的第一步是要去寻找页面资源的位置。如果导航到 Example Domain,HTML页面被定位到 IP 地址为93.184.216.34的服务器。如果以前没有访问过这个网站,就需要进行 DNS 查询。
浏览器向域名服务器发起 DNS 查询请求,最终得到一个 IP 地址。第一次请求之后,这个 IP 地址可能会被缓存一段时间,这样可以通过从缓存里面检索 IP 地址而不是再通过域名服务器进行查询来加速后续的请求。
每个主机名 在页面加载时通常只需要进行一次 DNS 查询。但是,对于页面指向的不同的主机名,则需要多次 DNS 查询。如果字体、图像、脚本、广
相关文章:

Chrome浏览器原理及优化
1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...

2025_2_9 C语言中队列
1.队列(先进先出) 队列也是一种受限制的线性结构 它只能在一端添加元素,在另一端访问,删除元素 (队首插入,队尾删除) 因为链表实现没有数组实现快,所以队列大多数是用数组实现的 q…...

[图文]DeepSeek能做对《软件方法》的测试题吗?
目前为止,我已经针对《软件方法》涉及的知识点出了几百道选择题,我们来看一下DeepSeek能不能做对这些题。 在选择题目时,我刻意向后兼容,选择只要受过严谨的软件开发方法学训练,即使没听说过《软件方法》也应该能通过…...

推荐个Deepseek网站
这几天有用到Deepseek,但是官网老时崩溃,硅基流动这个网站感觉还可以用,赠送了十多块钱,用完要收费,但比较便宜,可以接受。 https://siliconflow.cn/zh-cn/models 这里可以设置给模型添加固定的标签需求...

【Linux开发工具】C/C++ 在Linux下的编译器-gcc/g++
目录 一、前言 二、gcc/g的使用 三、程序翻译的四个阶段 1.预处理 2.编译 3.汇编 4.链接 四、动静态库 1.库函数的命名和分类 2. 动静态库的区别 一、前言 学习了vim的使用方法后,我们就可以高效编辑文本文件了,但vim并不像vs一样编辑好.c文件…...

hmi界面:工业设计风格如何识别,有什么应用场景。
一、工业设计风格在 HMI 界面中的视觉特征 (一)简洁的布局 功能分区明确 工业设计风格的 HMI 界面往往将不同的功能模块进行清晰的分区,每个区域都有明确的用途。例如,操作区、显示区、状态区等划分一目了然,用户可以…...

NIO三大组件
文章目录 概述Channel & BufferSelector服务器设计历史演化多线程版设计线程池版设计selector 版设计 概述 NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件:Channel 、 Buffer 、Selector Channel & Buffer channel (中文 管道的…...
pytest.fixture
pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...
MHTML文件如何在前端页面展示
MHTML文件如何在前端页面展示 需求背景: 目前在给证券公司做项目,但是在使用新系统的过程中,甲方还希望之前之前系统的历史记录可以看到。 最初制定的计划是项目组里面做数据的把原系统页面爬取下来,转成图片,直接给…...

学习笔记:在华为云ModelArts上运行MindSpore扩散模型教程
目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源:…...
使用sharding-jdbc实现读写分离
简介 读写分离是一种数据库架构设计的模式,主要用于提高数据库的性能和可扩展性。它将数据库的读取操作和写入操作分离到不同的数据库实例上,从而优化系统的负载和响应速度。 实现前提是需要进行主从复制(数据层面的分离) 实现…...

“图像识别分割算法:解锁视觉智能的关键技术
嘿,各位朋友!今天咱们来聊聊图像识别分割算法。这可是计算机视觉领域里特别厉害的一项技术,简单来说,它能让机器“看懂”图像中的不同部分,并把它们精准地分出来。想象一下,机器不仅能识别出图里有猫还是狗…...
【Go语言快速上手】第二部分:Go语言进阶
文章目录 并发编程goroutine:创建和调度 goroutinechannel:无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包:Mutex、RWMutex、WaitGroup 等同步原语Mutex:互斥锁RWMutex:…...

GRN前沿:GRETA:从多模式单细胞数据推断基因调控网络方法的比较与评价
1.论文原名:Comparison and evaluation of methods to infer gene regulatory networks frommultimodal single-cell data 2.发表日期:20254.12.21 摘要: 细胞通过基因表达调节其功能,由转录因子和其他调节机制的复杂相互作用驱…...
python基础入门:4.4模块与包管理
Python模块与包管理完全指南:构建可维护的代码结构 # 示例项目结构 """ my_package/ ├── __init__.py ├── core/ │ ├── __init__.py │ ├── utils.py │ └── calculator.py ├── data/ │ └── config.json └── tes…...

《XSS跨站脚本攻击》
一、XSS简介 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名&…...

LC-两数之和、字母异位词分组、最长连续序列、移动零、盛最多水的容器
两数之和 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length; // 获取数组 nums 的长度// 外层循环:遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环:从 nums[i] 的下一个元素 nums[j] 开始遍…...

Netty源码解析之线程池的实现(二):创建线程与执行任务
前言 先看下面的代码: public class MyTest {public static void main(String[] args) {//创建NioEventLoopGroupNioEventLoopGroup loopGroup new NioEventLoopGroup(3);System.out.println(Thread.currentThread()"准备执行任务");//执行任务for (in…...

IDEA - 一个启动类多次启动方法
More Run/Debug -> Modify Run Configuration -> modify options -> Allow mutiple instances...

U3D支持webgpu阅读
https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...