浏览器的底层机制、CRP优化技巧、如何解决DOM消耗性能、同步异步、进程和线程

article/2025/11/10 19:23:54

文章目录

  • 浏览器的底层机制:
      • 步骤一:生成DOM树「DOM TREE」
      • 步骤二:生成CSSOM树「CSSOM TREE」
      • 步骤三:合成渲染树 「RENDER TREE」
      • 步骤四:Layout布局 & 回流/重排
      • 步骤五:分层
      • 步骤六:Painting绘制 & 重绘
  • CRP优化技巧:
  • 操作DOM比较消耗性能:
        • 页面第一次渲染,必然会出现一次Layout(回流)和Painting(重绘):第一次渲染完成后;
        • 如果基于JS操作DOM,那么前端性能优化“必做”的事情:减少DOM的重排(回流)
        • 1、 基于vue/React/Angular等框架进行开发,我们是基于“数据驱动视图渲染”,规避了直接操作DOM,我们只需要操作数据,框架内部帮助我们操作DOM(它们做了很多减少DOM重排的操作)!
        • 2、读写分离
        • 3、批量新增元素
        • 4、修改元素的样式尽可能使用“transform”「translate位移、scale缩放、rotate旋转。。。」
        • 5、如果真的引发重排,也把性能消耗降到最低
  • JS中的同步和异步编程:
  • 进程和线程:


浏览器的底层机制:

步骤一:生成DOM树「DOM TREE」

当我们从服务器获取HTML代码后,浏览器会分配“GUI渲染线程”自上而下解析代码

  • 遇到:分配一个新的“HTTP线程”去获取对应的CSS资源,GUI继续向下渲染「异步」

  • 遇到 <style>:无需获取资源,但是GUI也不会立即去渲染CSS代码,防止渲染树错乱;会等待DOM结构渲染完成,访问的link等资源也获取到了,按照之前书写的顺序,依次渲染样式!

  • 遇到@import:也需要去服务器获取资源(基于HTTP线程)但是这个操作会把“GUI线程”挂起,无法继续向下获取,直到CSS资源获取到之后,GUI才会继续向下渲染「同步:阻碍GUI渲染」

  • 遇到<img>:和link是一样的,也是异步操作,也会分配新的HTTP线程去获取图片资源,GUI继续向下渲染

  • 遇到<script>:因为JS中要涉及关于DOM的操作,所以遇到<script>,默认会阻碍GUI的继续渲染;

    • 先分配HTTP线程去获取JS资源
      • 资源获取后,再分配JS引擎线程把JS代码先渲染了
      • 都渲染完了,GUI在继续向下渲染

      • 自上而下处理完成后,目前只是把页面中的DOM结构(节点),构建出对应的层级关系!而这就是DOM树!「触发DOMContentLoaded事件」
        在这里插入图片描述

步骤二:生成CSSOM树「CSSOM TREE」

DOM树生成后,等待CSS资源都获取到,此时按照CSS书写的顺序,依此渲染和解析CSS代码(GUI渲染线程),生成CSSOM树:计算出每个节点具备的样式「含某些样式式继承过来的等,样式是自己写的」
在这里插入图片描述

步骤三:合成渲染树 「RENDER TREE」

把DOM树和CSSOM树合并在一起,生成渲染树
在这里插入图片描述

步骤四:Layout布局 & 回流/重排

按照当前可视窗口大小,计算每一个节点在试图中的位置和大小

步骤五:分层

计算每一层(每一个文档流)中各个节点的具体绘制规则

步骤六:Painting绘制 & 重绘

按照计算好的规则,一层层的进行绘制

CRP优化技巧:

  • 我们最好把所有的css合并压缩成一个,只请求一次就把所有样式获取到即可;分多次请求,因为http的并发限制和可能出现的网络拥堵等问题,导致并不如请求一次快!!

    • CSS合并为一个
    • JS合并为一个
    • 雪碧图
    • 。。。
  • 尽可能不要使用@import导入式,因为他会阻碍GUI的渲染;如果CSS样式代码不是很多,使用style内嵌式更好(尤其是移动端开发);但是如果代码很多,还是使用link外链式(但是最好把link放在<head>中);

  • 图片懒加载一定要处理:不要再第一次渲染页面的时候,让图片资源的请求,去占用有限的HTTP线程以及宽带资源,优先本着CSS/JS资源获取;当页面渲染完成后,再去根据图片是否出现在视口中,来加载真实的图片;

  • 关于<script>的优化

    • 最好把<script>放在body的末尾,等待DOM结构加载完成,再去获取和解析JS「此时就可以获取DOM元素了」
    • 也可以基于事件监听去处理
      • window.onload:等待页面中所有资源(含DOM结构/CSS/JS等资源)都加载完触发
      • window.addEventListener(‘DOMContentLoaded’,function(){}):只需要等待DOM结构加载完就会触发,所以触发的时机比window.onload会早很多;
    • 也可以给<script>设置 async 或者 defer 异步属性
      • async 「获取异步,渲染同步」:遇到<script async>,分配新的HTTP去获取资源,GUI会继续渲染;
        当资源获取之后,立即结束GUI渲染,让JS引擎线程去渲染解析JS;JS代码渲染完,再去执行GUI渲染;
      • defer 「获取异步,渲染异步」:遇到<script defer>,分配HTTP去获取资源,此时GUI继续渲染,当DOM结构渲染完成,而且设置defer的JS资源也都获取到了, 按照之前编写的JS顺序,依此渲染JS代码!
    async的特点是:只要js代码获取到,就会立即执行,不管书写的先后顺序,适用于JS之间不存在依赖的时候“谁先请求回来先执行谁”;
    defer的特点是:必须等待GUI以及所有设置defer的JS代码都获取到,在按照之前书写的顺序,依此渲染和解析,即实现了资源的异步获取,也可以保证JS代码之间的依赖关系!
    
  • 加快DOM TREE的构建

    • 减少HTML的层级嵌套
    • 使用符合W3C规范的语义化标签
    • 。。。
  • 加快CSSOM TREE的构建

    • 选择器层级嵌套不要过深(或者前缀不要过长)「选择器的渲染顺序:从右到左」
    • 减少CSS表达式的使用
    • 。。。

操作DOM比较消耗性能:

大部分性能都消耗在了“DOM的重排(回流 Reflow)和重绘(Repaint)”

页面第一次渲染,必然会出现一次Layout(回流)和Painting(重绘):第一次渲染完成后;

  • 重排(回流):如果”浏览器的视口大小“发生改变 或者 页面中”元素的位置“、大小发生改变 再或则DOM结构发生变化(删除、新增元素或挪动位置)。。。浏览器都需要重新计算节点在视口中(本层)的最新位置「也就是重新Layout」,完成后再分层和重新绘制!------> 此操作非常消耗性能,所以我们应该尽可能减少重排(回流)的次数
  • 重绘:视口/元素的位置大小都不变,只是修改了一些基础样式(例如:背景颜色、文字颜色、透明度…),此时我们无需重新Layout,只需要重新Painting即可!----->重绘操作是必不可免的,只要想让页面第一次渲染完后还可以再改变,必然需要重绘;而且触发一次回流,也必然会经历重绘!

如果基于JS操作DOM,那么前端性能优化“必做”的事情:减少DOM的重排(回流)

1、 基于vue/React/Angular等框架进行开发,我们是基于“数据驱动视图渲染”,规避了直接操作DOM,我们只需要操作数据,框架内部帮助我们操作DOM(它们做了很多减少DOM重排的操作)!

2、读写分离

  • 新版本浏览器中存在“渲染对列机制”:当前上下文代码执行过程中,遇到修改元素样式的操作,并不会立即去修改样式,而是把其挪至到渲染队列中,代码继续向下执行。。。当代码执行完成后,此时会把渲染队列中,所有修改样式的操作,统一执行一次「只触发一次重排」;
  • 但是在此过程中,如果遇到了获取元素样式的操作,则“刷新渲染队列”(也就是把目前队列中操作执行一次),引发一次重排!!
    • 把获取样式的操作和修改样式的操作分离开
box.style.width='100px';
box.style.height='100px';
console.log(box.clientWith);

3、批量新增元素

  • 基于模版字符串实现批量新增
 let str=``;for(let i=1;i<=10;i++){str+=`<div>${i}</div>`;
} 
document.body.innerHTML+=str; //会导致BODY原始结构中绑定的事件全部消失,所以此操作适用于:原始容器中没有任何内容, 我们把新的内容插入进去
  • 文档碎片
let frg=document.createDocumentFragment(); //创建文档碎片:装DOM元素的内容
for(let i=1;i<=10;i++){let divBox-document.createElement('div');divBox.innerHTML=i;frg.appendChild(divBox); // 每一次创建元素,先放置在文档碎片中
}
document.body.appendChild(feg); //最后统一把文档碎片中所有内容放在body末尾,引发一次重排

4、修改元素的样式尽可能使用“transform”「translate位移、scale缩放、rotate旋转。。。」

  • 这个属性开启了硬件加速,不会引发重排(回流)

5、如果真的引发重排,也把性能消耗降到最低

  • 尽量把修改样式的元素,单独放在一个层面中(脱离文档流),这样即便重排,也只是对这一层的处理
  • 基于JS实现动画,尽量牺牲平滑度换取速度

。。。

JS中的同步和异步编程:

  • 同步编程:上一步事情没有处理完,下一件事情无法处理
  • 异步编程: 上一步事情没有处理完,也无需等待,可以继续处理后面的事情

进程和线程:

一个进程中可能包含多个线程

  • 进程:一般代表一个程序(或者浏览器打开一个页面就开辟一个进程)
  • 线程:程序中具体干事的人

浏览器是多线程的,当基于浏览器打开一个页面(开辟一个进程),会有不同的线程同时去做多件事情

  • GUI渲染线程:用来渲染和解析HTML/CSS的,以及绘制页面
  • JS引擎线程:用来渲染和解析JS的
  • HTTP网络线程:用来从服务器获取相关资源文件的「同源下,最多同时开辟5~7个HTTp网络线程」
  • 定时器监听线程:监听定时器是否到时间的(计时的)
  • 事件监听线程:监听事件是否触发的
  • 。。。

http://chatgpt.dhexx.cn/article/4WAdIkqF.shtml

相关文章

浏览器页面性能分析指南(chrome)

1.首先我们需要无痕模式打开一个新的chrome标签&#xff0c;可以按CtrlShiftN开启一个无痕模式的chrome 选择无痕模式是为了不让其他的插件干扰你 我们先写一个html的小例子&#xff0c;里面有一些js代码用来做性能分析的用例 html文件的代码如下&#xff1a; 这里是使用vsc…

浏览器兼容性问题,前端性能优化、SEO优化

目录 一、常见浏览器兼容性问题及解决二、前端性能优化三、SEO优化 一、常见浏览器兼容性问题及解决 不同浏览器的内核不尽相同&#xff0c;所以各个浏览器对网页的解析存在一定的差异。 浏览器内核主要分为两种&#xff0c;一是渲染引擎&#xff0c;另一个是js 引擎&#xff…

Chromium浏览器的一些使用总结

Chromium浏览器的一些使用总结 1.快捷键 一般使用快捷键插件实现快捷键的定义、修改、禁用。 关于禁用快捷键插件&#xff0c;在网上找到disable-keyboard-shortcuts插件。正常插件是在google商店上安装的crx格式&#xff0c;国内上不去。有很多第三方插件&#xff0c;考虑到开…

浏览器原理 38 # 加载阶段性能:使用 Audits(Lighthouse) 来优化 Web 性能

说明 浏览器工作原理与实践专栏学习笔记 什么是 Web 性能? Web performance&#xff1a;https://en.wikipedia.org/wiki/Web_performance Web 性能描述了 Web 应用在浏览器上的加载和显示的速度。 性能检测工具&#xff1a;Performance vs Audits Performance 和 Audits&am…

浏览器兼容性 问题产生原因 厂商前缀 滚动条 css hack 渐近增强 和 优雅降级 caniuse

目录 浏览器兼容性问题产生原因厂商前缀滚动条 css hack渐近增强 和 优雅降级caniuse 浏览器兼容性 问题产生原因 市场竞争标准版本的变化 厂商前缀 比如&#xff1a;box-sizing&#xff0c; 谷歌旧版本浏览器中使用-webkit-box-sizing:border-box 市场竞争&#xff0c;标准…

前端性能优化(二)02-页面性能优化之浏览器——浏览器是多进程的 浏览器的渲染机制

前端性能优化&#xff08;二&#xff09;02-页面性能优化之浏览器——浏览器是多进程的 & 浏览器的渲染机制 浏览器是多进程的 进程线程简单的理解&#xff1a;进程里面可以有多个线程&#xff0c;进程就是QQ&#xff0c;线程就是会话。 浏览器是多进程的浏览器之所以能够…

优化-浏览器缓存和压缩优化

一、减少HTTP请求 1.图片地图&#xff1a; 假设导航栏上有五幅图片&#xff0c;点击每张图片都会进入一个链接&#xff0c;这样五张导航的图片在加载时会产生5个HTTP请求。然而&#xff0c;使用一个图片地图可以提高效率&#xff0c;这样就只需要一个HTTP请求。 服务器端图片…

浏览器原理及性能优化

1. 影响页面性能的因素 HTTP 请求复杂的页面逻辑重度的DOM操作服务端响应大量的数据… 2. 优化网页性能 资源压缩与合并&#xff08;代码打包&#xff09;异步加载CDNDNS 预解析缓存… 一、浏览器 1.1 主要作用 浏览器的主要功能就是向服务器发出请求&#xff0c;在浏览器…

前端性能优化(三)——浏览器九大缓存方法

浏览器缓存是浏览器保存数据用于快速读取或避免请求重复资源&#xff0c;提升网页加载速度。缓存的数据到底放哪了呢&#xff1f;作为开发者&#xff0c;有时也需要检查一下缓存中的内容。所以介绍下缓存方法以及缓存内容在哪查找&#xff1f; 上一篇文章介绍的是《浏览器缓存…

chrome浏览器性能分析

匿名模式 匿名模式可以保证Chrome在一个相对干净的环境下运行。比如安装了许多chrome插件&#xff0c;这些插件可能会影响我们分析性能表现 使用快捷键ctrl shift N 即可代码匿名模式下的chrome新标签页 如果想分析移动设备 的页面性能&#xff0c;可用CPU控制器来模拟移动…

浏览器性能优化(初笔记后续修改补充)

参考&#xff1a;【前端工程师面试宝典】学习说明_互联网校招面试真题面经汇总_牛客网 (nowcoder.com) 性能优化 前端性能优化的手段 方面&#xff1a;加载优化、执行优化、渲染优化、样式优化、脚本优化 加载优化:减少HTTP请求、缓存资源、压缩代码、无阻塞、首屏加载、按需…

深入浏览器内部谈性能优化

1. 浏览器发展历史 a. 1995 年&#xff0c;美国网景公司因“网景浏览器”的发布而快速崛起 b. 同年&#xff0c;微软发布windows95&#xff0c;捆绑IE c. 2002年&#xff0c;微软占据了浏览器市场80%的份额 2. 浏览器三大进化路线&#xff08;Web应用能做的事以及未来发展趋…

GreenPlum数据库数据脱敏

1、首先备份要操作的数据库表&#xff0c;防止对原表误操作。 2、例子&#xff1a;数据库表名&#xff1a;st_person&#xff0c;要操作的字段为&#xff1a;phone 3、select phone from st_person ; --看看表里该字段是否有数据&#xff0c;大概格式是什么&#xff0c;该表…

数据库防火墙、数据库加密、数据库脱敏真的可用吗?

数据库是所有信息系统的核心&#xff0c;数据库的安全通常是指其中所存数据的安全&#xff0c;是网络安全、信息安全的重要组成部分。目前有很多相关性产品&#xff0c;如数据库加密、数据库防火墙、数据库脱敏、数据库审计等。 一、数据库防火墙 数据库防火墙系统&#xff1a;…

mysql动态脱敏查询_数据库动态脱敏

原标题&#xff1a;数据库动态脱敏 产品简介 中安威士数据动态脱敏系统(简称VS-DM)&#xff0c;通过截获并修改数据库通讯内容&#xff0c;对数据库中的敏感数据进行在线的屏蔽、变形、字符替换、随机替换等处理&#xff0c;达到对用户访问敏感数据真实内容的权限控制。对存储于…

MySQL 脱敏函数

项目场景&#xff1a; 示例:项目涉及到敏感数据&#xff0c;例如手机号、姓名等使用mysql存储函数解决。 解决方案&#xff1a; 提示&#xff1a;以下主要使用mysql函数CONCAT、LEFT、RIGHT。 1、CONCAT(str1,str2,…) CONCAT()函数返回结果为连接参数产生的字符串。如有任…

跨数据库跨系统,数据脱敏有新招

作者介绍 贝壳找房DBA团队&#xff0c;负责链家、贝壳找房的数据库服务治理及运维&#xff0c;包括MySQL、Redis、Kafka、RocketMQ、TiDB等产品。为保证线上服务高效、安全、稳定运行&#xff0c;面向研发同学提供一站式的数据库操作平台&#xff0c;建设了满足99.99%标准的高可…

imperva数据库脱敏-server2008

首先安装一个server2008其他的server也行 然后安装java环境 后安装tomcat中间件 一路默认就好 这就是tomcat的控制台 然后安装postgresql数据库 官方的要求是9.1-9.3的版本。 这个数据库也是默认安装就好。里面的密码我设的的Webco123 数据库安装完成 下一步安装发现脱敏的控…

《Sharding-JDBC》——数据库分表+数据库脱敏实现方案

本文从实际情况出发&#xff0c;解决生产中单表数据过大&#xff0c;和数据被拖库导致的问题&#xff0c;并进行的解决方案。本案例使用的框架为轻量型的jfinal&#xff0c;分表数据库脱敏&#xff0c;均采用了Apache的shardingsphere。 首先我们要先明确这样一个业务场景&…

mysql数据脱敏_数据脱敏|静态脱敏|动态脱敏—数据库脱敏_产品

1、敏感数据自动识别 数据脱敏系统可通过预定义敏感数据特征库&#xff0c;在任务执行过程中通过智能匹配识别敏感数据&#xff0c;最大限度的实现脱敏工作自动化&#xff0c;简化以手工方式按字段名定义敏感数据的繁琐工作。 2、丰富的脱敏算法 数据脱敏系统内置同义替换、数据…