【前端八股文】浏览器系列:性能优化——HTML、CSS、JS、渲染优化
文章目录
- HTML
- CSS
- CSS加载会造成阻塞吗
- JavaScript
- 渲染优化
- 参考
本系列目录:【前端八股文】目录总结
是以《代码随想录》八股文为主的笔记。详情参考在文末。
代码随想录的博客_CSDN博客-leecode题解,ACM题目讲解,代码随想录领域博主
性能优化,从以下几个方面来进行。

HTML
- 避免HTML中直接写CSS
- viewport加速页面渲染
- 使用语义化标签
- 减少标签的使用:DOM解析是一个大量遍历的过程
- 避免src空值
- 减少DNS查询数
避免HTML中直接写CSS
- 对浏览器来说,样式文件是一个单独的文件,可以在本地建立一个缓存,有利于加快访问网页。
- 对服务器来说,如果样式文件浏览器减少加载,就可以减少此网络请求,可以节约服务器带宽。
viewport加速页面渲染
<meta name="viewport" content="width=device-width, initial-scale=1">
使用语义化标签
语义化标签,如p表示段落paragraphs,h表示标题head
使用语义化标签有利于搜索引擎优化(SEO)。
减少标签的使用
DOM解析是一个大量遍历的过程,减少不必要的标签,就能降低遍历的次数。
避免src空值
src用于替换当前元素。它指向外部资源,指向的内容会嵌入到文档中标签的位置。请求src资源时会阻塞其他资源的下载和处理。即,src是先加载再运行后面的代码。
避免src空值可以缩减浏览器首屏渲染的时间。 原因:浏览器在渲染过程中会把src属性中的空内容进行加载,直至加载失败,影响DOMContentLoaded与Loaded事件之间的资源准备过程,拉长了首屏渲染的事件。
减少DNS查询数
在DNS查询过程中,浏览器什么都不会做,保持空白。如果DNS查询很多,网页性能会受到很大影响。
减少DNS查询次数:需要减少来自不同domain的请求的数量,如尽量将外部域的对象下载到本地服务器上等。
CSS
- 避免后代选择符
link代替@import- 减少回流与重绘
- CSS放head中
- 压缩CSS,开启gzip压缩
- 骨架屏+loading
- 避免选择器过多嵌套
避免后代选择符
一般来说开发中HTML和CSS是分开的。使用后代选择符会严重依赖于HTML代码,当HTML修改后CSS也要修改。
如:
div ul li{
}
link代替@import
使用@import引入CSS会影响浏览器的并行下载。 用@import引用的CSS文件只有在此文件下载解析结束后,浏览器才会知道还有别的CSS要下载。这会导致浏览器无法并行下载样式文件。
多个@import可能会导致下载顺序紊乱。 在IE中,排列在@import后面的js文件会先于@import下载,会打乱甚至破坏@import自身的并行下载。
减少回流与重绘
回流会导致浏览器重新构建渲染树,降低浏览器渲染速度。以下操作会触发回流与重绘,我们要尽量避免以下操作:
- 改变
font-size和font-family - 改变元素内外边距
- 通过JS改变CSS类
- 通过JS获取DOM元素的位置相关属性(如width/height/left等)
- CSS伪类激活
- 改变窗口大小
css放head中
css放在head中,先加载css,构建css规则树,同时构建DOM树,都构建完成后就构建render树,进行计算布局网页。
css放在body底部,在DOM树构建完成后开始构建render树(这里的render树中的css规则是浏览器默认样式),计算布局绘制网页,在css加载完之后,开始构建css规则树,然后再构建render树,再进行计算布局和绘制。
也就是说,css放在body底部会比在head中多构建一次render树,在性能方面不够好。同时,放在body底部网页会闪现 默认样式的DOM结构,用户体验不好。
压缩CSS,开启gzip压缩
gzip主要用于压缩html、css、js等静态文本文件,压缩后的体积可以达到原来的30%左右。
骨架屏+loading
当资源加载耗时较长时,页面会显示为白屏。而骨架屏就是在页面显示出来之前的、与页面内容类似的屏幕。它只需要CSS支持,不需要网络请求,可以减少白屏的时间,提升用户体验。
避免选择器过多嵌套
浏览器解析选择器会逐级匹配,嵌套过多会产生性能问题。实际上,css选择器是从右往左解析的。也就是说,如:
div ul li{
}
先找到所有的li,再留下有祖先节点ul的li,最后留下有祖先节点div的ul的li。显然,过多的嵌套会影响性能。
相关方法:
- 避免使用通配符:通配符可以匹配HTML的任何元素(即,遍历DOM),增加解析复杂度
- 使用class和id选择器:降低选择器的嵌套层数,减少解析的复杂度
- 避免使用后代选择器
CSS加载会造成阻塞吗
- CSS加载不会阻塞DOM树解析
- CSS加载会阻塞DOM树渲染
- CSS加载会阻塞后面JS的执行
相关解释:
DOM树解析与CSS无关,与HTML有关,因此CSS加载不会阻塞DOM树解析。
CSS加载会阻塞DOM树渲染,因为CSS会改变样式布局,若边加载CSS边渲染DOM树,一旦布局发生变化就会引起回流和重绘。
CSS加载会阻塞后面JS的执行。因为JS可以动态修改CSS,若不阻塞的话,结果会不可预估。
JavaScript
- 避免循环操作DOM
- 把script放在body后
- 事件委托
对于把script放在body后,可以详看:【前端】JS异步加载
省流:
JS会操作DOM元素,若把script放在body前,JS会阻塞HTML的解析。
对于事件委托:绑定事件时,不绑定在目标元素上,而是绑定到其祖先元素上。这样:
- 监听事件少
- 新增节点时,无需增加事件绑定
原理是事件捕获和事件冒泡:终于弄懂了事件冒泡和事件捕获!
关于阻止事件冒泡:
有两种方式来阻止事件冒泡:
- event.stopPropagation():只阻止事件冒泡。
$('#div1').mousedown(function(event)){event.stopPropagation();
}
- return false:不仅阻止事件冒泡,还阻止事件本身。
$('#div1').mousedown(function(event)){return false;
}
渲染优化
- 懒执行
- 懒加载
- 防抖节流
- 雪碧图
懒执行
将某些逻辑延迟到使用时再计算。该技术可以用于首屏优化。
对于某些耗时逻辑且不需要在首屏就使用的,就可以使用懒执行。懒执行需要唤醒:一般可以通过定时器或者事件的调用来唤醒。
懒加载
将不关键的资源延后加载——只加载用户正浏览或即将浏览的图片
只加载自定义区域(通常是可视区域,或即将进入可视区域)内需要加载的东西。对图片来说,先设置图片标签的src属性为一张占位图,真实的图片资源放入自定义属性data-src中,当进入自定义区域时,将自定义属性替换为src属性,这样就会下载图片资源。
防抖节流
防抖
n秒后再执行该事件,若在n秒内被重复触发,则重新计数。
也可以理解为:单位时间内多此触发,只执行最后的那一次。
原理:延迟执行,期间但凡有新的触发就重置定时器。
节流
n秒内只触发一次,若在n秒内重复触发,只有一次生效。
原理:上锁,只有满足一定价格时间才能执行。
应用场景
防抖场景:
- 搜索框搜索输入。只需用户最后一次输入完,再发送请求。
- 手机号、邮箱验证输入检测。输入完后再检测。
- 窗口大小resize。窗口调整完毕后再进行渲染。防止重复渲染。
节流场景:
- 滚动加载,滚动到底部加载更多。不用一滚动就监听,可以n秒内监听一次。
- 监听搜索框,搜索联想功能。n秒内联想一次即可,不用时时联想。
雪碧图
若页面有10个图,则需要10次网络请求。若把10个图拼成一个大图,则只需要一次网络请求。
且同源域名有最大并发限制,如Chrome为6个,则要加载10个图需要两次并发。
优点:
- 减少请求次数
- 减少服务器压力
- 减少并发
- 提高加载速度
参考
前端性能优化-DNS解析优化_dns缓存时间_红目香薰的博客-CSDN博客
为什么前端优化时要避免空的src_祝大余的博客-CSDN博客
关于空href和src对渲染影响的验证和思考_总一把烂牌的博客-CSDN博客
浏览器加载、渲染以及优化页面的顺序和方法_关于页面加载解析渲染过程的顺序正确的是_谁是听故事的人的博客-CSDN博客
前端面试(1)-页面渲染-性能优化_王小七七的博客-CSDN博客
页面渲染机制和性能优化总结 - 掘金 (juejin.cn)
css行内样式为什么尽量不要使用-css教程-PHP中文网
web前端性能优化(全汇总) - 掘金 (juejin.cn)
针对CSS、HTML、JavaScript如何进行性能优化_html加载的css与js较多怎么提高效率_努力做一只合格的前端攻城狮的博客-CSDN博客
css面试题(7)CSS优化、提高性能的方法有哪些?_学至分享的博客-CSDN博客
前端面试题-CSS选择器性能优化 - 前端の进行时 - SegmentFault 思否
CSS性能优化 - 掘金 (juejin.cn)
CSS性能优化的8个技巧 - 掘金 (juejin.cn)
CSS性能优化的几个技巧 - 掘金 (juejin.cn)
CSS样式为什么放在head中,而不放在body底部_css 在head 和body的区别_小蛮牧码者的博客-CSDN博客
前端性能优化之gzip压缩(压缩js、css、HTML,千万不能压缩图片!)_gzip压缩图片_Ashley的成长之路的博客-CSDN博客
web性能优化之页面加载体验(骨架屏) - 桔子桑 - 博客园 (cnblogs.com)
vue首屏优化之骨架屏_骨架屏为什么可以优化白屏时长_云之彼端灬约定之所的博客-CSDN博客
浏览器解析CSS选择器 - 简书 (jianshu.com)
css的选择器嵌套过多带来的影响 - 掘金 (juejin.cn)
css加载会造成阻塞吗? - 知乎 (zhihu.com)
前端性能优化——渲染优化 - 掘金 (juejin.cn)
相关文章:
【前端八股文】浏览器系列:性能优化——HTML、CSS、JS、渲染优化
文章目录HTMLCSSCSS加载会造成阻塞吗JavaScript渲染优化参考本系列目录:【前端八股文】目录总结 是以《代码随想录》八股文为主的笔记。详情参考在文末。 代码随想录的博客_CSDN博客-leecode题解,ACM题目讲解,代码随想录领域博主 性能优化,从以下几个方…...
Linux分文件编程:静态库与动态库的生成和使用
目录 一,Linux库引入之分文件编程 ① 简单说明 ② 分文件编程优点 ③ 操作逻辑 ④ 代码实现说明 二,Linux库的基本说明 三,Linux库之静态库的生成与使用 ① 静态库命名规则 ② 静态库制作步骤 ③ 静态库的使用 四,Linu…...
技术人的管理学-业务管理
主要内容前言制定计划遇到的问题?过程监控遇到的问题?复盘改进遇到的问题?通过PDCA循环解决业务管理问题总结前言 没有人天生就会管理,优秀的管理者都是在知行合一的过程中成长起来的,他们既需要系统的管理知识&#…...
Dubbo的独门绝技,SPI实现原理分析
文章目录前言普通SPI实现原理实例化扩展点源码分析扩展点加载流程分析LoadingStrategy分析接口定义接口实现加载原理loadClass方法分析自适应SPI实现原理自适应扩展代码生成分析自激活SPI简单使用原理分析Activate注解源码分析IOC实现原理objectFactory介绍总结AOP实现原理总结…...
单例模式,饿汉与懒汉
文章目录什么是单例模式单例模式的两种形式饿汉模式懒汉模式懒汉模式与饿汉模式是否线程安全懒汉模式的优化什么是单例模式 单例模式其实就是一种设计模式,跟象棋的棋谱一样,给出一些固定的套路帮助你更好的完成代码。设计模式有很多种,单例…...
Prometheus监控实战之Blackbox_exporter黑盒监测
1 Blackbox_exporter应用场景 blackbox_exporter是Prometheus官方提供的exporter之一,可以提供HTTP、HTTPS、DNS、TCP以及ICMP的方式对网络进行探测。 1.1 HTTP 测试 定义 Request Header信息 判断 Http status / Http Respones Header / Http Body内容 1.2 TC…...
【蓝桥杯集训·每日一题】AcWing 1051. 最大的和
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴线性DP一、题目 1、原题链接 1051. 最大的和 2、题目描述 对于给定的整数序列 A{a1,a2,…,an},找出两个不重合连续子段,使得两子段中所有数字的和最…...
【Unity工具,简单应用】Photon + PUN 2,做一个简单多人在线聊天室
【Unity工具,简单应用】Photon PUN 2,做一个简单多人聊天室前置知识,安装,及简单UI大厅聊天室简单同步较复杂同步自定义同步最终效果前置知识,安装,及简单UI 【Unity工具,简单学习】PUN 2&…...
程序员增加收入实战 让小伙伴们都加个鸡腿
文章目录前言1️⃣一、发外包平台💁🏻♂️二、朋友介绍✍️三、打造自己的个人IP👋🏿四、混群拉单🤳🏿五、面试拉单💻六、技术顾问🦴七、开发个人项目总结:前言 程序员…...
GPIO四种输入和四种输出模式
GPIO的结构图如下所示: 最右端为I/O引脚,左端的器件位于芯片内部。I/O引脚并联了两个用于保护的二极管。 输入模式 从I/O引脚进来就遇到了两个开关和电阻,与VDD相连的为上拉电阻,与VSS相连的为下拉电阻。再连接到TTL施密特触发…...
ChatGPT能够改变时代吗?一点点思考
都知道ChatGPT的出现对整个世界产生了剧烈的影响,前不久出的ChatGPT4更是在ChatGPT3.5的基础上展现了更强的功能。比如说同一个问题,ChatGPT3.5还是乱答的,ChatGPT4已经能给出正确解了。当然这只能说明技术是进步的。 虽然如此,很…...
Markdown如何使用详细教程
目录 一、Markdown 标题 二、Markdown 段落 三、Markdown 字体 四、Markdown 分隔线 五、Markdown 列表 六、Markdown 引用 七、Markdown 代码 八、Markdown 链接 九、Markdown 图片 十、Markdown 表格 前言 当前许多网站都广泛使用 Markdown 来撰写博客,…...
HTML5庆祝生日蛋糕烟花特效
HTML5庆祝生日蛋糕烟花特效 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>HTML5 Birthday Cake Fireworks</title><style>canvas {position: absolute;top: 0;left: 0;z-index: -1;}</style> </h…...
算法套路四——反转链表
算法套路四——反转链表 算法示例一:LeetCode206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 初始化pre为空,cur为头指针 pre指针:记录当前结点的前一个结点 cur指针:记录当…...
多线程 (六) wait和notify
🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…...
React--》状态管理工具—Mobx的讲解与使用
目录 Mobx的讲解与使用 Mobx环境配置 Mobx的基本使用 Mobx计算属性的使用 Mobx监听属性的使用 Mobx处理异步的使用 Mobx的模块化 Mobx的讲解与使用 Mobx是一个可以和React良好配合的集中状态管理工具,mobx和react的关系相当于vuex和vue之间的关系࿰…...
有效的括号长按键入验证外星语词典字符的最短距离用栈实现队列
有效的括号来源:杭哥20. 有效的括号 - 力扣(LeetCode)bool isValid(char * s) {int szstrlen(s);char stack[sz];int k0;for (int i0;i<sz;i){if (s[i]( || s[i][ || s[i]{){stack[k]s[i];}else{if (k0){return false;}else if (s[i]} &am…...
《前端开发者的进阶之路》
前端作为Web开发的重要领域之一,不断地发展和演变着。除了基本的HTML、CSS、JavaScript技能,前端开发者需要掌握更多的进阶知识才能应对不断变化的需求。本文将介绍一些前端的进阶知识,帮助前端开发者进一步提高自己的技能水平。1.框架和库在…...
为什么说网络安全是风口行业?是IT行业最后的红利?
前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万&…...
使用shell 脚本,批量解压一批zip文件,解压后的文件放在以原zip文件名前10个字符的文件夹中的例子
#!/bin/bash for file in *.zip dofolder$(echo $file | cut -c 1-10)mkdir $folderunzip -q $file -d $folder doneecho "All zip files have been extracted." # 说明: # 1. for循环遍历当前目录下的所有zip文件 # 2. 使用cut命令提取zip文件名前10个字…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
