【前端八股文】浏览器系列:性能优化——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属性中的空内容进行加载,直至加载失败,影响DOMContentLoadedLoaded事件之间的资源准备过程,拉长了首屏渲染的事件。

减少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-sizefont-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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】STL容器、算法的简单认识

几种模板首先认识一下函数模板、类模板、栈模板。函数模板函数模板就是一个模型&#xff0c;而模板函数是函数模板经过类型实例化的函数。如下template<class T>是一个简单的函数模板&#xff1a;template<class T> T Max(T a, T b) {return a > b ? a : b; } …

Joomla未授权访问漏洞CVE-2023-23752

1、前言Joomla是一套全球知名的内容管理系统&#xff08;CMS&#xff09;&#xff0c;其使用PHP语言加上MySQL数据库所开发&#xff0c;可以在Linux、Windows、MacOSX等各种不同的平台上运行。2月16日&#xff0c;Joomla官方发布安全公告&#xff0c;修复了Joomla! CMS中的一个…

cjson文件格式介绍

cjson是一种轻量级的JSON解析库&#xff0c;它支持将JSON格式的数据转换为C语言中的数据结构&#xff0c;同时也支持将C语言中的数据结构转换为JSON格式的数据。cjson的文件格式是指在使用cjson库时&#xff0c;将JSON格式的数据存储在文件中&#xff0c;然后通过cjson库读取文…

C++ 学习笔记(十)(继承、抽象篇)

前言&#xff1a;主要是自己学习过程的积累笔记&#xff0c;所以跳跃性比较强&#xff0c;建议先自学后拿来作为复习用。 文章目录1 定义父类和子类1.1 定义父类访问说明符 protected1.2 定义子类1.3 子类向父类的转换1.4 转换的例外1.5 子类的构造函数1.6 静态成员不能继承1.7…

clip精读

开头部分 1. 要点一 从文章题目来看-目的是&#xff1a;使用文本监督得到一个可以迁移的 视觉系统 2.要点二 之前是 fix-ed 的class 有诸多局限性&#xff0c;所以现在用大量不是精细标注的数据来学将更好&#xff0c;利用的语言多样性。——这个方法在 nlp其实广泛的存在&…

2023年ACM竞赛班 2023.3.20题解

目录 瞎编乱造第一题 瞎编乱造第二题 瞎编乱造第三题 瞎编乱造第四题 瞎编乱造第五题 不是很想编了但还是得编的第六题 不是很想编了但还是得编的第七题 还差三道题就编完了的第八题 还差两道题就编完了的第九题 太好啦终于编完了 为啥一周六天早八阿 瞎编乱造第一题…

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数&#xff0c;也称为一次函数&#xff0c;是指只有一个自变量xxx的函数&#xff0c;且函数表达式可以写成yaxbyaxbyaxb的形式&#xff0c;其中aaa和bbb是常数。具体来说&#xff0c;aaa称为斜…

typedef uint8_t u8;(stm32数据类型)

在stm32单片机的库文件里有这么一段u8和u16的定义 typedef uint8_t u8; typedef uint16_t u16&#xff1b; 而uint8_t和uint16_t的定义是这样的 typedef unsigned char uint8_t; typedef unsigned short int uint16_t; 意味着u8就是就是指代的unsigned char …

linux简单入门

目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff0…

【Nginx二】——Nginx常用命令 配置文件

Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后&#xff0c;输入 nginx -&#xff1f;查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…

[数据结构]直接插入排序、希尔排序

文章目录排序的概念和运用排序的概念排序运用常见的排序算法常见的排序算法直接插入排序希尔排序性能对比排序的概念和运用 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操…

FastApi快速构建一个web项目

FastApi快速构建一个web项目 已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效率非常之高。今天我一个Demo来介绍一下这个框架的使用。供大家学习参考。 项目介绍 本项目主要介绍fastapi快速编写web服务&#xff0c;通过案例分别…

贪心算法(一)

一、概念 贪心算法的核心思想是&#xff0c;在处理一个大问题时&#xff0c;划分为多个局部并在每个局部选择最优解&#xff0c;并且认为在每个局部选择最优解&#xff0c;那么最后全局的问题得到的就是最优解。 贪心算法可以解决一些问题&#xff0c;但是不适用于所有问题&a…

音乐制作:Ableton Live 11 Suite Mac

Ableton Live 11 Suite Mac是一款非常专业的音乐制作软件&#xff0c;Live 是用于音乐创作和表演的快速、流畅和灵活的软件。它带有效果、乐器、声音和各种创意功能;制作任何类型的音乐所需的一切。以传统的线性排列方式进行创作&#xff0c;或者在 Live 的 Session 视图中不受…

MyBatisPlus的Wrapper使用示例

一、wapper介绍 1、Wrapper家族 在MP中我们可以使用通用Mapper&#xff08;BaseMapper&#xff09;实现基本查询&#xff0c;也可以使用自定义Mapper&#xff08;自定义XML&#xff09;来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。 Wrappe…

【Spring6】| Spring IoC注解式开发

目录 一&#xff1a;Spring IoC注解式开发 1. 回顾注解 2. 声明Bean的四个注解 3. Spring注解的使用 4. 选择性实例化Bean 5. 负责注入的注解&#xff08;重点&#xff09; 5.1 Value 5.2 Autowired与Qualifier 5.3 Resource 6. 全注解式开发 一&#xff1a;Spring I…

Springboot+vue开发的图书借阅管理系统项目源码下载-P0029

前言图书借阅管理系统项目是基于SpringBootVue技术开发而来&#xff0c;功能相对比较简单&#xff0c;分为两个角色即管理员和学生用户&#xff0c;核心业务功能就是图书的发布、借阅与归还&#xff0c;相比于一些复杂的系统&#xff0c;该项目具备简单易入手&#xff0c;便于二…

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要&#xff1a;基于深度学习的车型识别系统用于识别不同类型的车辆&#xff0c;应用YOLO V5算法根据不同尺寸大小区分和检测车辆&#xff0c;并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…

你掌握了吗?在PCB设计中,又快又准地放置元件

在印刷电路板设计中&#xff0c;设置电路板轮廓后&#xff0c;将零件(占地面积)调用到工作区。然后将零件重新放置到正确的位置&#xff0c;并在完成后进行接线。 组件放置是这项工作的第一步&#xff0c;对于之后的平滑布线工作是非常重要的工作。如果在接线工作期间模块不足…

MagicalCoder可视化开发平台:轻松搭建业务系统,为企业创造更多价值

让软件应用开发变得轻松起来&#xff0c;一起探索MagicalCoder可视化开发工具的魔力&#xff01;你是否为编程世界的各种挑战感到头痛&#xff1f;想要以更高效、简单的方式开发出专业级的项目&#xff1f;MagicalCoder低代码工具正是你苦心寻找的产品&#xff01;它是一款专为…
最新文章