前端性能优化总结笔记

资源加载优化

DNS预解析

简单介绍:

DNS 的作用是将域名解析为 IP 地址,解析的过程是耗时的,转化后会做本地缓存,我们的优化的目标主要是针对用户第一次访问站点的时候陷入长时间白屏的问题。

DNS 解析可以分为两类:

第一类是页面 DNS 解析,第一次访问站点, 这个过程是省不了的
第二类是其他资源的 DNS 解析,在浏览器解析 html 的时候,会遇到一些 script 元素、link 元素,此时会暂停 html 的解析,转而加载 JS,里面就包含了 DNS 解析,这个过程是耗时的,会阻塞浏览器渲染主线程,所以该如何进行优化呢?答案是采用 DNS 预解析!

dns预解析是提前解析之后可能会用到的域名,使解析结果缓存到系统缓存中,缩短DNS解析时间,进而提高网站的访问速度,其范围包括文档的所有链接,包括图片、CSS、JS;

如何开启DNS预解析

在 HTML 的 head 部分添加以下代码来启用 DNS 预解析,href 属性指定了需要预解析的主机名

<link rel="dns-prefetch" href="//baidu.com">

ps: dns-prefetch 仅对跨域上的 DNS 查找有效,因此请避免使用它来指向相同域
HTTP 页面下所有的 a 标签的 href 都会自动去启用 DNS Prefetch,也就是说,你网页的 a 标签 href 带的域名,是不需要在 head 里面加上 link 手动设置的。

缓存

  1. zache离线压缩包(服务端,资源越近越好)
    页面主文档、JS&CSS资源、核心图片资源添加Zcache ,(离线压缩包缓存) 告诉客户端提前加载资源
  2. 强缓存和协商缓存(服务端负责)

使用 CDN

通过在多台服务器部署相同的副本,当用户访问时,服务器根据用户跟哪台服务器距离近,来决定哪台服务器去响应这个请求

压缩响应

减少 HTTP 请求产生的响应包的大小, Web 客户端可以通过 HTTP 请求中的 Accept-Encoding 头来标识对压缩的支持, 如果 Web 服务器看到请求中的这个头,就会使用客户端列出的方法中的一种来压缩响应。Web 服务器通过响应中的 Content-Encoding 头来告知 Web 客户端使用哪种方法进行的压缩

图片压缩

  1. 压缩方法有两种,一是通过在线网站进行压缩,二是通过 webpack 插件 image-webpack-loader
  2. 使用 webp 格式的图片
    优点:更高的压缩率,得到更小的文件,使得载速度更快,提升网页加载性能和用户体验
    缺点:老旧浏览器不兼容,编码和解码速度更慢
    发现带透明通道的图片或者较小的图片压缩后会更大
  3. 提倡小图转base64, base64可以将一张图片数据编码成一串字符串,使用该字符串代替图像地址, 减少一张图片的http请求

预加载

  1. 使用preload, prefetch预加载css或者图片
    preload用于提前加载当前页面所需的关键资源(首页)
    prefetch 用于在浏览器空闲时提前加载未来页面可能需要的资源(非首页)

  2. 图片懒加载,滚动到相应位置才加载图片。
    图片的加载是由 src 引起的,当对 src 赋值时,浏览器就会请求图片资源。将图片地址存储到data-xxx属性上, 判断图片是否在可视区域, 如果在,就设置图片src, 绑定scroll监听事件

代码逻辑优化

Css

选择器减少嵌套, 减少使用后代表达器和通配符,避免使用css 表达式会被频繁地计算。
能用css3实现的图片尽量不要用图片(cilp-path, 渐变、阴影等)
css3动画和canvas动画都比JS动画性能好

js

js可以修改CSSOM和DOM,因此js会阻塞页面的解析和渲染,并且会等待css资源的加载。给js资源添加defer或者async,延迟js脚本的执行。或者将 script 标签放在 body 标签底部的原因。(提首屏)

减少重绘重流

● display: none改为使用visibility:hidden ;
● 通过修改元素的 class/csstext,而不是直接修改样式属性,这样可以将多个样式的变化合并成一次重排和重绘。
● 使用 CSS 动画而不是通过 JavaScript 修改样式,可以利用硬件加速,提高性能, 如使用 transform:translateY 替代 position:top(top会触发回流)
● 分离读写操作, 缓存布局信息,避免重复取值:offsetLeft,scrollLeft, 为了获取最新值, 会造成浏览器强制刷新渲染队列
● 离线操作: 批量修改DOM时,可以先让元素脱离文档流,等修改完毕后,再放入文档流。(文档片段createdocumentFragment)
● 使用 requestAnimationFrame: 使用该 API 能够将重排和重绘操作集中在一次浏览器绘制之前执行,减少性能开销。

设定宽度和高度

可减少CLS(累计位移偏移), 用户体验更好. 如果没有设置,但这样做会导致浏览器在渲染页面的时候,一边下载图片一边计算大小,图片很多的时候,需要不断地调整页面,

防抖和节流

比如点击事件触发请求等, 要做好防抖节流

首屏优化手段

  1. 骨架屏(首屏)
  2. 服务端渲染(ssr)
  3. js放在页面底部加载

性能分析工具

  1. 利用webpack analayze插件分析打包情况, 是否有公共依赖包重复打包,没用的包被打包, 不同版本的包被重复打包
  2. preformance: 生成性能面板
  3. lighthouse: 性能测试工具, 生成分析报告,返回性能分数,给出性能指导方案,

webpack优化

组件库按需引入

只引入指定组件和对应的样式
elementUI 需要借助 babel-plugin-component 插件实现

gzip 压缩(比较旧)

考虑到浏览器的兼容性,Gzip 不需要在webpack进行压缩,最好用nginx配置,动态进行

tread-loader多线程打包

由于webpack 是单线程模型的,tread-loader能让webpack 同一时间处理多个任务,发挥多核 CPU 电脑的作用

Tree Shaking

可删除无用代码, 前提是模块必须采用 ES6 Module 语法,因为 Tree Shaking 依赖 ES6 的静态语法:import 和 export。不同于 ES6 Module,CommonJS 支持动态加载模块,在加载前是无法确定模块是否有被调用,所以并不支持 Tree Shaking

externals 提取项目依赖

如果有依赖是外部环境(自己的cdn,第三方cdn 不稳定)提供的,在打包时告诉 externals这些忽略它们, 缺点:直接在html内引入的,失去了按需引入的功能,只能引入组件库完整的js和css

常见的性能指标

Frist Contentful Paint(FCP): 页面上第一个元素绘制的时间点,对应白屏时间,
LCP(Largest Contentful Paint): 最大内容绘制,指页面上最大的图片或文字绘制的时间点
Time to Interactive(TTI):可流畅地响应用户交互的时间, 找到第一个连续 5s 安静窗口,从安静窗口反推,找到最后一个长任务, 这个长任务结束的时间点就是 TTI
FID(First Input Delay ): 用户首次交互时间
CLS Cumulative Layout Shift): 累计位移偏移, 越低说明页面跳来跳去的情况就越少,用户体验越好
如何减少CLS
a. 给image,video或者其他具有长宽比的元素设置长宽值;
b. 尽量不要在已经渲染的内容前面插入内容;
c. 尽量选择transform animations属性去触发布局变动;

参考文档

前端性能优化系列——DNS预解析和优化
当面试官问我前端可以做的性能优化有哪些
前端性能优化——包体积压缩82%、打包速度提升65%

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

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

相关文章

Flink中因java的泛型擦除导致的报错及解决

【报错】 Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function Custom Source could not be determined automatically, due to type erasure. You can give type information hints by using th…

【php实战项目训练】——thinkPhP的登录与退出功能的实现,让登录退出畅通无阻

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Mendix 创客访谈录|Mendix助力开发高手10日交付复杂应用,且支持移动端呈现

本期创客 莊秉勳 布鲁科技技术顾问 各位Mendix社群的夥伴好&#xff0c;我是莊秉勳&#xff0c;大家也可以叫我Danny。 我大學是資訊科學背景&#xff0c;在與Mendix相遇前&#xff0c;曾在一上市製造企業&#xff0c;擔任軟體工程師&#xff0c;負責企業內部軟體開發&#xf…

Virtualbox 安装unbuntu + qemu

0. 前言 关于 Virualbox 安装虚拟机的优秀文章太多了&#xff0c;笔者主要是着重梳理一些安装小细节&#xff0c;利己利人&#xff01;&#xff01; 如果需要保姆式的安装教程&#xff0c;可以查看后续的参考链接。 1. VirtualBox 的安装 直接去官网搜索最近的软件即可&…

js每日十题(二)

1. 6.3 js第6题 以下结语句中&#xff0c;返回true的是&#xff1f; A !![] B 1’1’ C nullundefined D !!’’ 答&#xff1a; A选项&#xff0c;由于数组属于对象类型&#xff0c;所以空的数组转换成布尔型是true&#xff0c;前置&#xff01;&#xff01;&#xff0c;两次取…

【paper】环形虚拟管内的多无人机协同目标包围

Multi-UAV cooperative target encirclement within an annular virtual tube2022.8ELSEVIER Aerospace Science and Technology【Q1 5.6】Yan Gao 全权 北航 Q1 Background&#xff1a;本文试图解决一个什么样的问题&#xff1f; 多无人机对单个静态目标进行连续包围任务&…

基于聚类和回归分析方法探究蓝莓产量影响因素与预测模型研究附录

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 背景数据说明数据来源思考 附录数据预处理导入包以及数据读取数据预览数据处理 相关性分析聚类分析数据处理确定聚类数建立k均值聚类模型 …

12- Redis 中的 链表 数据结构

Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构&#xff0c;所以 Redis 自己设计了一个链表数据结构。 1. 链表节点结构设计 先来看看【链表节点】结构的样子&#xff1a; typedef struct listNode {//前置节点struct listNode *prev;//后置节点…

liunx配置网络的命令

liunx配置网络的命令 文章目录 liunx配置网络的命令ifconfig命令查看路由表信息netstat命令ss命令lsof命令ping 命令nslookup命令 ifconfig命令 ifconfig:显示正在工作的网卡&#xff0c;启动的设备 ifconfig -a 展示所有设备 ens33: flags4163<UP,BROADCAST,RUNNING,MUL…

测试脚本参数设置

首先构建用例&#xff0c;关联脚本位置。 设置Jenkins服务器和Jenkins任务&#xff0c;设置Jenkins ip、测试阶段、测试平台、测试入口、主机CPU架构、操作系统版本、测试机类型、测试机资源、测试对象&#xff08;hba/raid&#xff09;、背板类型、是否编译安装包、编包对象、…

oracle with 递归查询

在Oracle SQL中&#xff0c;WITH子句&#xff08;也称为公共表达式或CTE&#xff0c;Common Table Expressions&#xff09;用于定义临时的命名结果集&#xff0c;这些结果集可以在主查询中引用。WITH子句可以简化复杂的SQL查询&#xff0c;使其更具可读性&#xff0c;特别是当…

RK3588+FPGA+算能BM1684X:高性能AI边缘计算盒子,应用于视频分析、图像视觉等

搭载RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主频高达 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更强的 CPU运算能力&#xff0c;具备6T AI算力&#xff0c;可扩展至38T算力。 产品规格 系统主控CPURK3588&#xff0c;四核…

银行数据治理:优化金融信息安全

在当今数字化时代&#xff0c;数据已成为银行等金融机构最重要的资产之一。然而&#xff0c;数据的数量和复杂性日益增加&#xff0c;给银行的数据治理带来了巨大挑战。数据治理不仅仅是数据的管理&#xff0c;更是数据质量、数据安全和数据价值的综合体现。为了解决这些挑战&a…

数字、钱工具栏

/*** 提取字符串中的 数字 带小数点 &#xff0c;没有就返回"0"** param money* return*/fun getMoney(money: String): String {var money moneyvar pattern Pattern.compile("(\\d\\.\\d)")var m pattern.matcher(money)if (m.find()) {money if (m.…

数据挖掘实战-基于长短期记忆网络(LSTM)的黄金价格预测模型 | 97% 准确度

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

PHP是世界上最好的编程语言?深入剖析其优势与挑战

PHP是世界上最好的编程语言&#xff1f;深入剖析其优势与挑战 PHP&#xff0c;作为一种广泛应用于Web开发的编程语言&#xff0c;常被一些人赞誉为“世界上最好的编程语言”。然而&#xff0c;这样的论断是否真的站得住脚&#xff1f;本文将从四个方面、五个方面、六个方面和七…

攻防世界babyRE做法(Linux调试)

在做题之前我们先了解一些知识点&#xff0c;首先是汇编中的知识点&#xff0c;汇编中&#xff0c;数据和代码可以说是一回事&#xff0c;数据和代码可以无条件相互转换&#xff0c;换句话说&#xff0c;数据就是代码&#xff0c;代码就是数据 接下来开始做题&#xff0c;简单…

【经验总结】怎样查看计算机CPU核数量

方法一&#xff1a;任务管理器 方法二&#xff1a;设备管理器 选中“计算机”右击&#xff0c;选择“属性”&#xff1a; 选择“设备管理器”->“处理器”&#xff0c;有几行就代表有几个核&#xff1a;

Ubuntu系统升级k8s节点的node节点遇到的问题

从1.23版本升级到1.28版本 node节点的是Ubuntu系统20.04的版本 Q1 node节点版本1.23升级1.28失败 解决办法&#xff1a; # 改为阿里云镜像 vim /etc/apt/sources.list.d/kubernetes.list# 新增 deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main# 执…

浙江大爱遮阳新材料股份有限公司新品发布会圆满成功

5月29日,浙江大爱遮阳新材料股份有限公司新品发布会在上海国家会展中心举办。本次会议出席的嘉宾有浙江大爱遮阳新材料股份有限公司总经理俞彬军,常务副总王志华,上海大爱益可美遮阳科技有限公司总经理陆俊青,浙江大爱遮阳新材料股份有限公司销售经理平鸿烈,销售经理蒋扬锋和玛…