JavaScript高级 浏览器的渲染原理

news2024/9/28 17:24:10

浏览器的渲染原理

    • 1. 网页的解析过程
    • 2. 浏览器内核
    • 3. 浏览器渲染过程
      • 1. HTML解析
      • 2. 生成CSS规则
      • 3. 构建Render Tree
      • 4. 布局(layout)
      • 5. 绘制(Paint)
    • 4. 回流和重绘解析
      • 1. 回流
      • 2. 重绘
      • 3. web 性能优化
      • 4. 合成和性能优化
    • 5. 浏览器遇到 script 元素的处理
    • 6. defer和async属性
      • 1. defer
      • 2. async
      • 3. 使用情况
    • @ 相关文献资料

1. 网页的解析过程

客户端(浏览器)发起页面请求,主机对 地址中的DNS 域名进行解析,找到对应的 IP 地址,请求发送到 服务端,服务器根据请求内容发送响应给客户端,客户端收到响应,将内容渲染成网页。

在这里插入图片描述

2. 浏览器内核

我们经常说的浏览器内核指的是浏览器的排版引擎,排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎,也就是一个网页下载下来后,就是由我们的渲染引擎来帮助我们解析的

3. 浏览器渲染过程

渲染引擎解析整个页面并将其呈现
在这里插入图片描述

1. HTML解析

因为默认情况下服务器会给浏览器返回index.html文件,所以解析HTML是所有步骤的开始

解析HTML,会构建DOM Tree

2. 生成CSS规则

解析的过程中,如果遇到CSS的link元素,那么会由浏览器负责下载对应的CSS文件,下载CSS文件是不会影响DOM的解析的

浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树

3. 构建Render Tree

当有了DOM Tree和CSSOM Tree后,就可以两个结合来构建Render Tree了

link元素不会阻塞DOM Tree的构建过程,但是会阻塞Render Tree的构建过程,这是因为Render Tree在构建时,需要对应的CSSOM Tree

Render Tree和DOM Tree并不是一一对应的关系,比如对于display为none的元素,压根不会出现在render tree

4. 布局(layout)

第四步是在渲染树(Render Tree)上运行布局(Layout)以计算每个节点的几何体,渲染树会表示显示哪些节点以及其他样式,但是不表示每个节点的尺寸、位置等信息,布局是确定呈现树中所有节点的宽度、高度和位置信息

5. 绘制(Paint)

第五步是将每个节点绘制(Paint)到屏幕上,在绘制阶段,浏览器将布局阶段计算的每个frame转为屏幕上实际的像素点,包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素(比如img)

4. 回流和重绘解析

1. 回流

第一次确定节点的大小和位置,称之为布局(layout),之后对节点的大小、位置修改重新计算称之为回流

引起回流的方式

比如DOM结构发生改变(添加新的节点或者移除节点)

比如改变了布局(修改了width、height、padding、font-size等值)

比如窗口resize(修改了窗口的尺寸等)

比如调用getComputedStyle方法获取尺寸、位置信息

2. 重绘

第一次渲染内容称之为绘制(paint),之后重新渲染称之为重绘

引起重绘的方式

比如修改背景色、文字颜色、边框颜色、样式等

3. web 性能优化

回流一定会引起重绘,所以回流是一件很消耗性能的事情,所以在开发中要尽量避免发生回流

可以采用的操作

修改样式时尽量一次性修改,比如通过cssText修改,比如通过添加class修改

尽量避免频繁的操作DOM,我们可以在一个DocumentFragment或者父元素中将要操作的DOM操作完成,再一次性的操作

尽量避免通过getComputedStyle获取尺寸、位置等信息

对某些元素使用position的absolute或者fixed,并不是不会引起回流,而是开销相对较小,不会对其他元素造成影响。

4. 合成和性能优化

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

默认情况下,标准流中的内容都是被绘制在同一个图层,而一些特殊的属性,会创建一个新的合成层(CompositingLayer),并且新的图层可以利用GPU来加速绘制,因为每个合成层都是单独渲染的

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

合成层的形成方式

3D transforms

video、canvas、iframe

opacity 动画转换时

position: fixed

will-change:一个实验性的属性,提前告诉浏览器元素可能发生哪些变化;

animation 或transition 设置了opacity、transform

5. 浏览器遇到 script 元素的处理

事实上,浏览器在解析HTML的过程中,遇到了script元素是不能继续构建DOM树的,它会停止继续构建,首先下载JavaScript代码,并且执行JavaScript的脚本,只有等到JavaScript脚本执行结束后,才会继续解析HTML,构建DOM树

延迟构建DOM树的原因

这是因为JavaScript的作用之一就是操作DOM,并且可以修改DOM,如果我们等到DOM树构建完成并且渲染再执行JavaScript,会造成严重的回流和重绘,影响页面的性能,所以会在遇到script元素时,优先下载和执行JavaScript代码,再继续构建DOM树

6. defer和async属性

在目前的开发模式中(比如Vue、React),脚本往往比HTML页面更“重”,处理时间需要更长,所以会造成页面的解析阻塞,在脚本下载、执行完成之前,用户在界面上什么都看不到,为了解决这个问题,script元素给我们提供了两个属性(attribute):defer和async

1. defer

defer 属性告诉浏览器不要等待脚本下载,而继续解析HTML,构建DOM Tree,脚本会由浏览器来进行下载,但是不会阻塞DOM Tree的构建过程,如果脚本提前下载好了,它会等待DOM Tree构建完成,在DOMContentLoaded事件之前先执行defer中的代码,所以DOMContentLoaded总是会等待defer中的代码先执行完成

多个带defer的脚本是可以保持正确的顺序执行的

从某种角度来说,defer可以提高页面的性能,并且推荐放到head元素中

2. async

async 特性与defer 有些类似,它也能够让脚本不阻塞页面

async是让一个脚本完全独立的,浏览器不会因async 脚本而阻塞,async脚本不能保证顺序,它是独立下载、独立运行,不会等待其他脚本,async不会能保证在DOMContentLoaded之前或者之后执行

3. 使用情况

defer通常用于需要在文档解析后操作DOM的JavaScript代码,并且对多个script文件有顺序要求的

async通常用于独立的脚本,对其他脚本,甚至DOM没有依赖的

@ 相关文献资料

How browsers work:https://web.dev/howbrowserswork/
在这里插入图片描述

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

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

相关文章

【VulnHub靶场】——CHRONOS: 1

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

PaddlePaddle/PaddleX本地离线安装(分别以C++和Python为例)

目录一. 本地离线安装简介1.1 为什么需要源码编译1.2 源码编译的产物1.3 源码编译的原理二. 本地离线安装准备2.1 编译准备(C/Python通用)2.2 本地编译推荐配置(C)2.3 本地编译推荐配置(Python)三. Windows本地离线安装(C源码编译)3.2 编译工具安装3.3 打开Visual studio 终端3…

torch.cat函数

#dim0,上下拼接 #dim1,左右拼接 import torch # x1 x1 torch.tensor([[1,2,3],[4,5,6]],dtypetorch.int)# x2 x2 torch.tensor([[7,8,9],[10,11,12]],dtypetorch.int)#inputs为2个形状为[2 , 3]的矩阵 inputs [x1, x2] print(inputs)#dim0,上下拼接…

如何用Python字符串进行切片操作?

嗨害大家好鸭!我是小熊猫~ 我们基本上都知道Python的序列对象 都是可以用索引号来引用的元素的, 索引号可以是正数由0开始从左向右, 也可以是负数由-1开始从右向左。 在Python中对于具有序列结构的数据来说都可以使用切片操作&#xff0…

【C++升级之路】第五篇:C/C++内存管理(new和delete的实现原理)

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【C学习与应用】 ✒️✒️本篇内容:C/C内存分布,C/C动态内存管理方法,C动态内存管理方法底层函数operator new 和operat…

浅谈树状数组

学习树状数组必不可少学习树状数组的精髓,lowbit()运算 在计算机中存储一个正数是以二进制的形式,而存储一个负数则是以二进制补码的形式,简单说就是二进制取反1,lowbit运算就是提取出最后一个1以后的位置,比如10100进…

【C语言】结构体、共用体、位域

结构体 1、 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. };这是其中一种声明方式~ 2、定义一个结构体变量 struct struct_name variable;3、访问成员变量 . 运算 一个结构体变量访问其成员时,使用的是 . 运算 下面…

BM35 判断是不是完全二叉树

题目 给定一个二叉树,确定他是否是一个完全二叉树。 完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。&a…

深入理解ConcurrentHashMap1.7源码

1. 概述 HashMap在我们的日常生活中使用很多,但是它不是线程安全的。我们可以使用HashTable来代替,主要实现方式是在方法中加入synchronized,所以效率也比较低。因此,对于键值对,我们可以尝试使用ConcurrentHashMap来…

实验室规划设计方案SICOLAB

一、实验室规划设计 喜格提供实验室布局方案 根据实验室性质、实验室定位、实验室功能、实验类型、实验工艺流程以及国家相关标准合理的规划布局。 喜格提供仪器摆放布局方案 根据该实验流程来确定仪器的种类、数量、规格型号、外形尺寸、电压功率等参数以及摆放位置以及提…

【Linux】tee、tail、killall、|、||、、命令学习

|、||、&、&&辨析 竖线‘|’在linux中是管道符的意思,将‘|’前面命令的输出作为’|后面的输入; 双竖线‘||’,用双竖线‘||’分割的多条命令,执行的时候遵循如下规则:如果前一条命令为真,则…

还在喷农民歌唱家大衣哥吗?他的一个不经意间的举动却造福了乡里

农民歌唱家大衣哥,一直以来都饱受争议,有人说他是炒货专家,然而事实真的如此吗?事实上,大衣哥也做了很多好事,像修桥补路等都不说了,单就他的一个不经意间的举动,就造福了四乡八邻。…

Windows内核--CPU和内核(1.7)

Windows内核支援哪些CPU? Intel x86/x86_64 IA64已不再支持. AMD amd64 ARM (Windows On Arm: WOA) ARM具备低功耗优势, 除了高通, 还有Broadcom/NXP等都支援ARM架构. 苹果自研M系列开了头,ARM不仅有低功耗,同样有性能,Windows也想分一杯羹…

【vue系列-03】vue的计算属性,列表,监视属性及原理

vue的核心属性一,vue核心属性1,计算属性2,监视属性3,样式绑定3.1,class样式绑定3.2,style样式绑定4,条件渲染5,列表渲染5.1,遍历列表5.2,key的作用5.3&#x…

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细)

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细) B-8任务八:隐写术应用 *任务说明:仅能获取Server8的IP地址 环境需求私信博主 1.找出文件夹1中的文件,将文件中的隐藏信息作为Flag值提交; 解题步骤如下 2.找出文件夹2中的文件,将文件中的隐藏信息…

基于Vue的数据可视化设计框架,数据大屏可视化编辑器

开发文档(★★★★★) 请访问 https://lizhensheng.github.io/vue-data-view/ 完整代码下载地址:基于Vue的数据可视化设计框架,数据大屏可视化编辑器 简介 DataView是一个基于Vue的数据可视化设计框架提供用于可拖拽的控件提供…

Spring之IOC入门案例

目录 一:IOC入门案例实现思路分析 1.IOC容器管理什么? 2. 如何将被管理的对象告知 IOC 容器 ? 3.被管理的对象交给 IOC 容器,要想从容器中获取对象,就先得思考如何获取到 IOC 容器 ? 4.IOC 容器得到后,如何从容…

C++首超Java

TIOBE 公布了 2022 年 12 月的编程语言排行榜。 TIOBE 将于下个月揭晓其 2022 年度编程语言,目前共有 3 个候选者:Python、C 和 C。TIOBE CEO Paul Jansen 指出,虽然 Python 和 C 已多次斩获该头衔,而 C 仅在 2003 年获得过一次&a…

Android---开发笔记

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…

彩色圣诞树圣诞树

目录 一、圣诞介绍 二、技术需要 三、效果展示 四、实现步骤 五、颜色的更改 六、源码 一、圣诞介绍 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在…