首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【总结】2072- 前端常见性能优化策略

【总结】2072- 前端常见性能优化策略

作者头像
pingan8787
发布于 2024-06-19 12:13:02
发布于 2024-06-19 12:13:02
20013
代码可运行
举报
文章被收录于专栏:前端自习课前端自习课
运行总次数:3
代码可运行

优化策略

  • 关键资源个数越多,首次页面加载时间就会越长
  • 关键资源的大小,内容越小,下载时间越短
  • 优化白屏:内联css和内联js移除文件下载,较小文件体积
  • 预渲染,打包时进行预渲染
  • 使用SSR加速首屏加载(耗费服务端资源),有利于SEO优化。 首屏利用服务端渲染,后续交互采用客户端渲染

什么是Perfomance API

衡量和分析各种性能指标对于确保 web 应用的速度非常重要。Performance API 提供了重要的内置指标,并能够将你自己的测量结果添加到浏览器的性能时间线(performance timeline)中。性能时间线使用高精度的时间戳,且可以在开发者工具中显示。你还可以将相关数据发送到用于分析的端点,以根据时间记录性能指标。

关键时间节点

描述

含义

TTFB

time to first byte(首字节时间)

从请求到数据返回第一个字节所消耗时间

TTI

Time to Interactive(可交互时间)

DOM树构建完毕,代表可以绑定事件

DCL

DOMContentLoaded (事件耗时)

当 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发

L

onLoad (事件耗时)

当依赖的资源全部加载完毕之后才会触发

FP

First Paint(首次绘制)

第一个像素点绘制到屏幕的时间

FCP

First Contentful Paint(首次内容绘制)

首次绘制任何文本,图像,非空白节点的时间

FMP

First Meaningful paint(首次有意义绘制)

首次有意义绘制是页面可用性的量度标准

LCP

Largest Contentful Paint(最大内容渲染)

在viewport中最大的页面元素加载的时间

FID

First Input Delay(首次输入延迟)

用户首次和页面交互(单击链接,点击按钮等)到页面响应交互的时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div style="background:red;height:100px;width:100px"></div>
<h1 elementtiming="meaningful"></h1>
<script>
    window.onload = function () {
        let ele = document.createElement('h1');
        ele.innerHTML = 'zf';
        document.body.appendChild(ele)
    }
    setTimeout(() => {
        const {
            fetchStart,
            requestStart,
            responseStart,
            domInteractive,
            domContentLoadedEventEnd,
            loadEventStart
        } = performance.timing;


        let TTFB = responseStart - requestStart; // ttfb
        let TTI = domInteractive - fetchStart; // tti
        let DCL = domContentLoadedEventEnd - fetchStart // dcl
        let L = loadEventStart - fetchStart;
        console.log(TTFB, TTI, DCL, L)

        const paint = performance.getEntriesByType('paint');
        const FP = paint[0].startTime;
        const FCP = paint[1].startTime; // 2s~4s
    }, 2000);

    let FMP;
    new PerformanceObserver((entryList, observer) => {
        let entries = entryList.getEntries();
        FMP = entries[0];
        observer.disconnect();
        console.log(FMP)
    }).observe({ entryTypes: ['element'] });

    let LCP;
    new PerformanceObserver((entryList, observer) => {
        let entries = entryList.getEntries();
        LCP = entries[entries.length - 1];
        observer.disconnect();
        console.log(LCP); // 2.5s-4s
    }).observe({ entryTypes: ['largest-contentful-paint'] });

    let FID;
    new PerformanceObserver((entryList, observer) => {
        let firstInput = entryList.getEntries()[0];
        if (firstInput) {
            FID = firstInput.processingStart - firstInput.startTime;
            observer.disconnect();
            console.log(FID)
        }
    }).observe({ type: 'first-input', buffered: true });
</script>

网络优化策略

减少HTTP请求数,合并JSCSS,合理内嵌CSSJS

合理设置服务端缓存,提高服务器处理速度。 (强制缓存、对比缓存)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Expires/Cache-Control   Etag/if-none-match/last-modified/if-modified-since

避免重定向,重定向会降低响应速度 (301,302)

使用dns-prefetch,进行DNS预解析

采用域名分片技术,将资源放到不同的域名下。接触同一个域名最多处理6个TCP链接问题。

采用CDN加速加快访问速度。(指派最近、高度可用)

gzip压缩优化 对传输资源进行体积压缩 (html,js,css)

加载数据优先级 : preload(预先请求当前页面需要的资源) prefetch(将来页面中使用的资源) 将数据缓存到HTTP缓存中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <link rel="preload" href="style.css" as="style">

关键渲染路径

  • 重排(回流)Reflow: 添加元素、删除元素、修改大小、移动元素位置、获取位置相关信息
  • 重绘 Repaint:页面中元素样式的改变并不影响它在文档流中的位置。

我们应当尽可能减少重绘和回流

1.强制同步布局问题

JavaScript强制将计算样式和布局操作提前到当前的任务中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="app"></div>
<script>
    function reflow() {
        let el = document.getElementById('app');
        let node = document.createElement('h1');
        node.innerHTML = 'hello';
        el.appendChild(node);
        // 强制同步布局
        console.log(app.offsetHeight);
    }
    requestAnimationFrame(reflow)
</script>

2.布局抖动(layout thrashing)问题

在一段js代码中,反复执行布局操作,就是布局抖动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function reflow(){
    let el = document.getElementById('app');
    let node = document.createElement('h1');
    node.innerHTML = 'hello';
    el.appendChild(node);
    // 强制同步布局
    console.log(app.offsetHeight);
}
window.addEventListener('load',function(){
    for(let i = 0 ; i<100;i++){
        reflow();
    }
});

3.减少回流和重绘

  • 脱离文档流
  • 渲染时给图片增加固定宽高
  • 尽量使用css3 动画
  • 可以使用will-change提取到单独的图层中

静态文件优化

1.图片优化

图片格式:

  • jpg:适合色彩丰富的照片、banner图;不适合图形文字、图标(纹理边缘有锯齿),不支持透明度
  • png:适合纯色、透明、图标,支持半透明;不适合色彩丰富图片,因为无损存储会导致存储体积大
  • gif:适合动画,可以动的图标;不支持半透明,不适和存储彩色图片
  • webp:适合半透明图片,可以保证图片质量和较小的体积
  • svg格式图片:相比于jpgjpg它的体积更小,渲染成本过高,适合小且色彩单一的图标;

图片优化:

避免空src的图片

减小图片尺寸,节约用户流量

img标签设置alt属性, 提升图片加载失败时的用户体验

原生的loading:lazy 图片懒加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img loading="lazy" src="./images/1.jpg" width="300" height="450" />

不同环境下,加载不同尺寸和像素的图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src="./images/1.jpg" sizes="(max-width:500px) 100px,(max-width:600px) 200px"  srcset="./images/1.jpg 100w, ./images/3.jpg 200w">

对于较大的图片可以考虑采用渐进式图片

采用base64URL减少图片请求

采用雪碧图合并图标图片等

2.HTML优化

  1. 语义化HTML:代码简洁清晰,利于搜索引擎,便于团队开发
  2. 提前声明字符编码,让浏览器快速确定如何渲染网页内容
  3. 减少HTML嵌套关系、减少DOM节点数量
  4. 删除多余空格、空行、注释、及无用的属性等
  5. HTML减少iframes使用 (iframe会阻塞onload事件可以动态加载iframe)
  6. 避免使用table布局

3.CSS优化

减少伪类选择器、减少样式层数、减少使用通配符

避免使用CSS表达式,CSS表达式会频繁求值, 当滚动页面,或者移动鼠标时都会重新计算 (IE6,7)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
background-color: expression( (new Date()).getHours()%2 ? "red" : "yellow" );

删除空行、注释、减少无意义的单位、css进行压缩

使用外链css,可以对CSS进行缓存

添加媒体字段,只加载有效的css文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<link href="index.css" rel="stylesheet" media="screen and (min-width:1024px)" /> 

CSS contain属性,将元素进行隔离

减少@import使用,由于@import采用的是串行加载

4.JS优化

通过asyncdefer异步加载文件

减少DOM操作,缓存访问过的元素

操作不直接应用到DOM上,而应用到虚拟DOM上。最后一次性的应用到DOM上。

使用webworker解决程序阻塞问题

IntersectionObserver

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const observer = new IntersectionObserver(function(changes) { 
    changes.forEach(function(element, index) {
        if (element.intersectionRatio > 0) {
            observer.unobserve(element.target);
            element.target.src = element.target.dataset.src;
        }
    });
});
function initObserver() {
    const listItems = document.querySelectorAll('img');
    listItems.forEach(function(item) {
        observer.observe(item);
    });
}
initObserver();

虚拟滚动 vertual-scroll-list

requestAnimationFramerequestIdleCallback

尽量避免使用eval, 消耗时间久

使用事件委托,减少事件绑定个数。

尽量使用canvas动画、CSS动画

5.字体优化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @font-face {
        font-family: "Bmy";
        src: url("./HelloQuincy.ttf");
        font-display: block;
        /* block 3s 内不显示, 如果没加载完毕用默认的   */
        /* swap 显示老字体 在替换 */
        /* fallback 缩短不显示时间, 如果没加载完毕用默认的 ,和block类似*/
        /* optional 替换可能用字体 可能不替换*/
    }
    body {
        font-family: "Bmy"
    }
    
`FOUT(Flash Of Unstyled Text)` 等待一段时间,如果没加载完成,先显示默认。加载后再进行切换。

`FOIT(Flash Of Invisible Text)`字体加载完毕后显示,加载超时降级系统字体 (白屏)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自习课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你好 大神 这个nginx安装第5步,上传zabbix.conf 文件配置到/etc/nginx/conf.d/ 这个文件在哪找?
你好 大神 这个nginx安装第5步,上传zabbix.conf 文件配置到/etc/nginx/conf.d/ 这个文件在哪找?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
openEuler-22.03-LTS-SP3 部署 Zabbix 6.0.27
Zabbix([`zæbiks])是一个基于Web界面的提供分布式系统监控以及网络监控功能的企业级的开源解决方案。用于监控各种网络设备,操作系统、数据库、中间件以及服务器的安全运营;并提供灵活的通知机制以让系统运维人员快速定位/解决存在的异常问题。
Kevin song
2024/03/12
2.1K0
openEuler-22.03-LTS-SP3 部署 Zabbix 6.0.27
zabbix上线之路(一)——zabbix安装
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
江小白
2018/07/03
1.8K1
长篇好文 | 全离线部署Zabbix7.0+MySQL8.0+PHP8.0
银行作为金融行业的重要组成部分,对信息系统的稳定性和安全性有着极高的要求。为了确保银行机房内的系统能够得到有效的监控,笔者选择部署Zabbix 7.0 LTS作为主力军。然而,由于银行机房的特殊安全策略,不允许直连互联网,这对安装和部署带来了一定的挑战。因此,笔者决定采用全离线部署和编译的方式来完成Zabbix 7.0 LTS的安装,具体步骤详见下文。
Zabbix
2025/02/27
6260
长篇好文 | 全离线部署Zabbix7.0+MySQL8.0+PHP8.0
Zabbix 6.0 LTS 6.0.12升级6.0.21(欧拉系统)
升级Zabbix 6.0.x 小版本,实现软件版本全生命周期管理,保留Nginx、PHP、MySQL原有版本,不对MySQL数据库进行更改操作,保留原有监控数据。
Kevin song
2023/09/12
1.1K0
Zabbix 6.0 LTS 6.0.12升级6.0.21(欧拉系统)
部署zabbix监控服务器
一、zabbix运行架构 Zabbix是一个企业级的分布式开源监控解决方案。它能够监控各种服务器的健康性、网络的稳定性以及各种应用系统的可靠性。当监控出现异常时,Zabbix通过灵活的告警策略,可以为任何事件配置基于邮件、短信、微信等告警机制。而这所有的一切,都可以通过Zabbix提供的web界面进行配置和操作,基于web的前端页面还提供了出色的报告和数据可视化功能。这些功能和特性使我们运维人员可以非常轻松的搭建一套功能强大的运维监控管理平台。
小手冰凉
2020/03/03
2.4K0
CentOS8.5下安装部署开源监控系统Zabbix 6.0LTS
CentOS7下Zabbix5.0+PostgreSQL12+TimescaleDB部署实践
yuanfan2012
2022/07/05
1.6K0
CentOS8.5下安装部署开源监控系统Zabbix 6.0LTS
zabbix监控在lnmp环境下编译安装小记
最近在复习运维常见的监控告警软件的时候,想起了 zabbix,于是先用军哥的 lnmp 一键安装包快速搭建了 lnmp 环境,然后成功编译安装了 zabbix,特地将安装过程和遇到的问题记录在此,以便自己或有需要的人来参考翻阅。 由于已有 php 运行环境,所以只需要编译安装 zabbix 即可。 一、安装依赖组件 yum -y install net-snmp net-snmp-devel perl-DBI php-gd php-xml php-bcmath fping OpenIPMI-devel ph
张戈
2018/03/23
1.3K0
zabbix监控在lnmp环境下编译安装小记
zabbix 2.2.20 安装详解(Centos6.9)
环境说明 [root@centos ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@centos ~]# uname -a
惨绿少年
2017/12/27
8840
zabbix 2.2.20 安装详解(Centos6.9)
centos7安装zabbix4及修复部分问题
https://www.cnblogs.com/xuezhigu/p/6652835.html
一朵灼灼华
2022/08/05
2800
centos7安装zabbix4及修复部分问题
CentOS 7编译安装Zabbix server
Zabbix是一个基于WEB界面提供分布式系统监视以及网络监视功能的企业级开源解决方案,如果您手里要需要管理多台服务器,使用Zabbix来监控非常合适。Zabbix由2部分构成,Zabbix server与可选组件zabbix agent。
星哥玩云
2022/08/13
6670
CentOS 7编译安装Zabbix server
从 1 到 0 构建博客项目(5) --ZABBIX安装与使用
zabbix采用的是CS模式,即有客户端和服务端,一般是由客户端主动发送采集的数据的(降低服务端的压力.)
大大刺猬
2020/11/01
1.3K0
从 1 到 0 构建博客项目(5) --ZABBIX安装与使用
Centos 7 安装Zabbix 5
1、关闭防火墙和selinux。不关闭seliunx会导致zabbix-server起不来
网络技术联盟站
2021/05/16
1.4K1
麒麟系统V10 SP2 编译安装 Zabbix 6.0.8 +MySQL 8.0.30 + PHP 7.4.30
初始化密码登录MySQL后只能执行修改密码的操作,其它任何操作是不能执行的,使用以下命令修改密码
Kevin song
2022/11/19
3.3K0
麒麟系统V10 SP2  编译安装  Zabbix 6.0.8  +MySQL 8.0.30 + PHP 7.4.30
Zabbix 5.4 在CentOS 8.2上的快速搭建
Zabbix 5.4 启动后总是弹出ZABBIX SERVER IS NOT RENNING: THE INFORMATION DISPLAYED MAY NOT BE CORRECT的原因为SELINUX没有关闭,在前面的配置中我们已经关闭了SELINUX,因为没有重启,所以配置没有生效。
dumpcat
2021/09/15
1.3K0
Zabbix 5.4 在CentOS 8.2上的快速搭建
Zabbix4.2安装和4.0升级4.2笔记
Server和ServerActive分别代表zabbix的被动模式和主动模式,这里都填server端的IP 最后一行是开启脚本采集数据
没有故事的陈师傅
2019/07/27
1K0
ZABBIX 4.0 LTS 部署
关于zabbix的详细使用可以参考之前的3.0 版本,该文档仅记录zabbix 4.0 编译安装过程! ZABBIX 3.0 从入门到精通(zabbix使用详解) : https://www.cnblogs.com/clsn/p/7885990.html ZABBIX 4.0 中文参考文档 : https://www.zabbix.com/documentation/4.0/zh/manual
惨绿少年
2019/05/24
6900
Zabbix 3.4编译安装全解读
前提准备 准备系统环境 # yum -y install wget vim lrzsz epel-release bash-completion ntpdate ntp # setenforce 0 # vim /etc/sysconfig/selinux SELINUX=disabled # systemctl disable firewalld && systemctl stop firewalld # ntpdate TIME_SERVER 安装Zabbix 通过包管理器安装 如果你希望快速构建测试
用户1456517
2019/03/05
1.1K0
Zabbix 3.4编译安装全解读
探索 Zabbix 5.0 LTS -- CentOS 8 (一)
2020.05 期待已久的 Zabbix 5.0 LTS 版本正式发布,全新的 Zabbix 5.0 LTS 对前端 web 进行重构带来全新的用户体验。发布基于 Go语言的下一代 Zabbix Agent2 和安全性全面升级等众多特性。接下来将介绍在 CentOS 8 搭建 Zabbix 5.0 LTS 和 Agent 2 以及 Zabbix 5.0 LTS 平台的简单使用。
Kevin song
2020/07/14
1.5K0
CentOS 7.6 下 Zabbix 4.04 安装文档
# rpm -qa | grep Java # yum remove java-1.8.0-openjdk # yum remove java-1.8.0-openjdk-headless
星哥玩云
2022/07/28
3490
CentOS 7.6 下 Zabbix 4.04 安装文档
统信服务器操作系统【Zabbix Agent 2 编译安装】
Zabbix Agent2在Zabbix 5.0版本推出,使用Go语言重写,旨在减少TCP连接数并提供改进的检查并发性。Agent2 引入了插件系统,简化了监控功能的扩展,支持对各种系统服务、数据库、IoT设备和Docker容器的深入监控。它具备开箱即用的证书监控、系统监控和文件属性监控功能,同时保持了与 Zabbix Agent 的兼容性。Agent 2 支持广泛的操作系统平台,便于安装和部署,为系统管理员提供了一个强大、灵活且高效的监控解决方案。
Kevin song
2024/04/30
7770
统信服务器操作系统【Zabbix Agent 2 编译安装】
相关推荐
openEuler-22.03-LTS-SP3 部署 Zabbix 6.0.27
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验