前端性能初探

news2024/11/18 11:38:43

前端监控

提升稳定性,更快的发现异常,定位异常,解决异常,js错误,接口异常,资源异常,白屏等。
关注用户体验,建立性能规范,长期关注优化,页面性能,接口性能,资源加载性能,卡顿监控
了解业务数据,指导产品升级,pv uv 业务数据,行为监控

前端监控的流程

数据采集

pv监控: 页面切换后新的url,页面切换的原因(初始化,spa,hash, history)
js错误: 错误对应的类型,描述,行列号,堆栈,错误发生前的用户交互,错误的上下文
性能监控: 首屏加载各阶段耗时,各性能指标,spa切换耗时,longtash等
请求监控: 请求的路径,状态码,请求头和响应头,请求各阶段的耗时等等
白屏监控: 白屏发生的页面,关联的异常,相关的上下文
静态资源监控,用户行为监控,自定义监控

组件上报

基础信息包装: 页面路由,页面标识,全局context,部署版本,部署环境,网络等
采样逻辑
用户自定义包装逻辑执行: 补充更多的上下文,数据脱敏等
队列暂存,聚合发送
sendBeacon: 在页面关闭的时候发送请求,不阻塞页面的加载

清洗存储

user-agent解析: 浏览器版本,系统版本,机型,设备品牌等
ip解析: 地区,省份,城市,运营商,地理位置等
分类型落表落库
处理js错误,堆栈归一化,堆栈反解析
clickhouse存储

数据消费

总览分析
各功能模块消费视角,多堆分析
单点查询,针对用户全生命周期上报数据的重建展示
数据订阅 实时报警
issue管理,归因分析

前端监控关注点

可交互性: 卡顿监控,请求性能
服务稳定性: 请求成功率 首屏性能
加载速度: 首屏性能
可用性: 渲染错误/白屏 请求错误 js错误 静态资源错误等
业务数据 pv/uv 自定义事件/打点

web性能指标

Navigation Timing

文档导航过程中的完整计时,一个文档从发起请求到加载完毕各阶段的性能耗时

Performance Timeline

提供了获取各种类型的性能时间线条的方法,navigation,resource,paint等性能时间线的方法

resource Timing

提供文档中资源的计时信息

paint timing

记录在页面加载期间的一些关键时间点

long tasks api

检测长任务的存在,长任务会在很长的一段时间内独占ui线程,阻塞其他关键任务的执行,比如响应用户输入
**传统的性能指标主要依赖navigation timages/果页面使用HTTPS,它的值是安全连接握手前的时刻
connectEnd: 当浏览器端完成与服务器建立连接的时刻
responseStart: 当客户端收到从服务器端(或缓存,本地资源)响应回的第一个字节的数据的时刻
responseEnd: 客户端收到从服务器端(或者缓存,本地资源)响应回的最后一个字节的数据的时刻
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/存在,长任务会在很长的一段时间内独占ui线程,阻塞其他关键任务的执行,比如响应用户输入
传统的性能指标主要依赖navigation timing或者是navigation timing 2,通过记录一个文档从发起请求到加载完毕的各阶段的性能耗时,以加载速度来衡量加载性能

navigation timing

navigationStart: 用户完成卸载前一个文档的时间点
redirectStart: 用户重定向开始的时间,或者是0
redirectEnd: 页面重定向结束的时间,或者是0

请求阶段

fetchStart: 浏览器发起资源请求时,有缓存时,则返回读取缓存的开始时间
domainLookupStart: 查询DNS的开始时间
domainLookupEnd: 查询DNS的结束时间
connectStart: 浏览器开始与服务器连接的时间
secureConnectionStart: 如果页面使用HTTPS,它的值是安全连接握手前的时刻
connectEnd: 当浏览器端完成与服务器建立连接的时刻
responseStart: 当客户端收到从服务器端(或缓存,本地资源)响应回的第一个字节的数据的时刻
responseEnd: 客户端收到从服务器端(或者缓存,本地资源)响应回的最后一个字节的数据的时刻
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以用户为中心的性能指标

传统的性能指标专注于衡量技术细节,很难反应出用户真正关心的是什么,创建用户为中心的指标,专注于用户视角下的浏览体验

指标分类

  1. 发生了吗: FP(first paint) FCP(first contentful paint)
  2. 内容有用吗: FMP(first meangingful paint) si(speed index)
  3. 内容可用吗: TTI(time to interactive)
  4. 令人愉悦吗: FID(first input delay)
    first paint: 首次渲染的时间点,fp时间点之前,用户看到的都是没有任何内容的白色屏幕
    fist contentful paint: 首次有内容渲染的时间点,在用户访问web网页的过程中,fcp时间点之前,用户看到的都是没有任何实际内容的屏幕,fcp反映当前web页面的网络加载性能情况,页面的dom结构复杂度情况,inline script执行效率的情况,当所有的阶段性能做的非常好的情况下,首次出现内容的情况,当所有的阶段性能做的非常好的情况下,首次出现内容的时间就会越短,用户等待的时间就会越短,流失的概念就会降低
    first meaningful paint: 首次绘制有意义内容的时间点,当整体页面的布局和文字内容全部渲染完成后,可以认为是完成了首次内容的绘制,fmp通常被认为是用户获取到了页面主要信息的时刻,也就是说,这个时候用户的需求是得到满足的,所以也会很关注fmp指标
    fmp代码实现的原理: 认为dom结构变化的时间点,和与之对应的渲染的时间点近似相同,所以fmp的时间点为dom结构变化最剧烈的时间点,dom结构变化的时间点,可以利用mutationobserver api来获得。
  5. 利用mutationobserver监听每一次页面整体的dom变化,触发mutationobserver的回调
  6. 在回调计算出当前dom树的分数,分数变化最剧烈的时刻,就是fmp的时间点
    speed index: 衡量页面可视区域加载速度,帮助检测页面的加载体验差异。
    time to interactive: 检测页面从开始加载到主要的子资源完成渲染,能够快速的,可靠的响应用户输入所需要的时间。tti反映页面的可用性的重要指标,tti值越小,代表用户可以越早的操作界面,用户体验越好
  • tti算法实现
    1. 首先进行首次内容绘制fcp
    2. 沿着时间轴正向搜索时长至少为5s的安静窗口,安静窗口: 没有长任务而且不超过两个正在处理的get网络请求
    3. 沿着时间轴反向搜索安静窗口之前的最后一个长任务,如果没有找到长任务,则会在fcp步骤停止执行
    4. tti是安静窗口之前最后一个长任务的任务结束时间,如果没有找到长任务,则和tcp值相同
      在这里插入图片描述

在这里插入图片描述

以用户为中心的性能指标

传统的性能指标专注于衡量技术细节,很难反应出用户真正关心的是什么,创建用户为中心的指标,专注于用户视角下的浏览体验

指标分类

  1. 发生了吗: FP(first paint) FCP(first contentful paint)
  2. 内容有用吗: FMP(first meangingful paint) si(speed index)
  3. 内容可用吗: TTI(time to interactive)
  4. 令人愉悦吗: FID(first input delay)
    first paint: 首次渲染的时间点,fp时间点之前,用户看到的都是没有任何内容的白色屏幕
    fist contentful paint: 首次有内容渲染的时间点,在用户访问web网页的过程中,fcp时间点之前,用户看到的都是没有任何实际内容的屏幕,fcp反映当前web页面的网络加载性能情况,页面的dom结构复杂度情况,inline script执行效率的情况,当所有的阶段性能做的非常好的情况下,首次出现内容的情况,当所有的阶段性能做的非常好的情况下,首次出现内容的时间就会越短,用户等待的时间就会越短,流失的概念就会降低
    first meaningful paint: 首次绘制有意义内容的时间点,当整体页面的布局和文字内容全部渲染完成后,可以认为是完成了首次内容的绘制,fmp通常被认为是用户获取到了页面主要信息的时刻,也就是说,这个时候用户的需求是得到满足的,所以也会很关注fmp指标
    fmp代码实现的原理: 认为dom结构变化的时间点,和与之对应的渲染的时间点近似相同,所以fmp的时间点为dom结构变化最剧烈的时间点,dom结构变化的时间点,可以利用mutationobserver api来获得。
  5. 利用mutationobserver监听每一次页面整体的dom变化,触发mutationobserver的回调
  6. 在回调计算出当前dom树的分数,分数变化最剧烈的时刻,就是fmp的时间点
    speed index: 衡量页面可视区域加载速度,帮助检测页面的加载体验差异。
    time to interactive: 检测页面从开始加载到主要的子资源完成渲染,能够快速的,可靠的响应用户输入所需要的时间。tti反映页面的可用性的重要指标,tti值越小,代表用户可以越早的操作界面,用户体验越好
  • tti算法实现
    1. 首先进行首次内容绘制fcp
    2. 沿着时间轴正向搜索时长至少为5s的安静窗口,安静窗口: 没有长任务而且不超过两个正在处理的get网络请求
    3. 沿着时间轴反向搜索安静窗口之前的最后一个长任务,如果没有找到长任务,则会在fcp步骤停止执行
    4. tti是安静窗口之前最后一个长任务的任务结束时间,如果没有找到长任务,则和tcp值相同
      在这里插入图片描述

first input delay: 测量从用户第一次和页面交互,比如说是单击连接,点按按钮等,浏览器对交互进行响应,实际能够开始处理时间,处理程序所经过的时间
1. fid反应用户对页面交互性和响应性的第一印象,良好的第一印象有助于用户建立对整个引用的良好印象
2. 页面加载阶段,资源的处理任务最重,也容易产生输入延迟,关注fid对提升页面的可交互性有很大的收益
3. fid和页面加载完成之后的input delay具有不同的解决方案,对于fid,一般建议通过code splitting来减少页面加载阶段js的加载,解析和执行时间,页面假爱完成后的input delay,通常是由于开发人员编写不当,引起的js执行时间过长而产生的
增加了三个全新的性能指标,填补了用户体验的空白,LCP(Largest contentful paint) TBT(Total Blocking Time) CLS(cumulative layout shift)
**LCP(largest contentful paint)**最大的内容在可视区域内变得可见的时间点

  1. LCP 容易理解,给出和fmp相似的结果,容易计算和上报
    TBT(total blocking time): 量化主线程在空闲之前的繁忙程序,有助于理解在加载期间,页面无法响应用户的输入的时间有多久
    长任务: 如果一个任务在主线程上运行超过50ms,超过50ms后的任务耗时,都算作任务的阻塞时间,一个页面的TBT, 是从FCP到TTI之间的所有长任务的阻塞时间的总和
    CLS: 量化了页面在加载的期间,视口中元素的移动程度

如何获取站点的性能指标

web-vitals相关的指标,可以通过chrome插件获取

前端性能优化和案例分析

网络优化

  1. 开启http/2 关注兼容性的问题,同时做好域名收缩,尽量减少子域,让http2的多路复用发挥作用。在http1中,由于浏览器会存在并发限制,所以会进行一个域名分散。
  2. 开启brotli压缩 相比于gzip,具有更高的broti压缩
    更高的压缩比,更快的压缩性能。
  3. 善用https 通过有效的优化手段,比如session resume, ocsp stapling等,提高https的性能
  4. 使用cdn部署静态资源 有效的降低访问延迟,提高可用性
  5. dns预解析 <link rel="dns-prefetch" href="//cdn.example.com">
  6. 提前建立网络连接 常用于server api等域名,兼容性更好 <link rel="preconnect" hre"//example.com">
缓存优化

memory cache: chrome缓存的第一道防线
cache api: 更细粒度的手动控制页面资源的缓存策略
http cache: 强缓存和协商缓存
push cache: server push产生的缓存
server

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

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

相关文章

TopOn对话游戏魔客:2024移动游戏广告应如何突破?

TopOn对话游戏魔客&#xff1a;2024移动游戏广告应如何突破&#xff1f; 近年来&#xff0c;游戏广告投放的成本日益走高&#xff0c;ROI如何回正&#xff0c;素材如何创新等问题困扰着每一个广告主。在隐私政策的实施下&#xff0c;广告投放难度也在不断升级。 据data.ai发布…

MK米客方德SD NAND参考设计

一、电路设计 参考电路&#xff1a; R1~R5 (10K-100 kΩ)是上拉电阻&#xff0c;当SD NAND处于高阻抗模式时&#xff0c;保护CMD和DAT线免受总线浮动。 即使主机使用SD NAND SD模式下的1位模式&#xff0c;主机也应通过上拉电阻上拉所有的DATO-3线。 R6&#xff08;RCLK&…

解决图片放大模糊

首先需要了解设备像素和CSS像素&#xff0c;CSS像素 是 Web 开发中的逻辑像素&#xff0c;设计者根据这些像素来布局页面。设备像素 是设备屏幕上的实际像素点数。 DPR 是 设备像素 和 CSS像素 的比率&#xff0c;所以进行缩放后&#xff0c;也需要对图片尺寸进行处理&#xf…

【HarmonyOS】鸿蒙自定义TabLayout示例

【HarmonyOS】自定义TabLayout代码示例&#xff0c;通过 Scroll 锚点 Tab 布局&#xff0c;滚动条会自动滚动使选中的标签居中显示。 class MyTabItem {label: string "";positionX: number -1; // 当前位置width: number -1; // 当前宽度constructor(label: stri…

OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 HDMI&#xff08;High Definition Multimedia Int…

VS Code设置合集

目录 VS Code设置合集1、汉化2、VS Code自动报错3、VS Code右键没有Open In Default Browser4、VS Code设置颜色主题5、修改默认缩进字符 VS Code设置合集 1、汉化 点击插件 → 搜索chinese → 点击install&#xff0c; 同时按住ctrl shift P → 搜索>configure displ…

架构师:消息队列的技术指南

1、简述 消息队列(Message Queue, MQ)是一种异步通信机制,允许系统的各个组件通过消息在彼此之间进行通信。消息队列通过解耦系统组件、缓冲高峰期请求和提高系统的可扩展性,成为分布式系统中不可或缺的一部分。 2、工作原理 消息队列的基本工作原理是生产者将消息发布到…

Lesson08---string(4)类

Lesson08—string类&#xff08;4&#xff09; c第八章string类的实现 文章目录 Lesson08---string类&#xff08;4&#xff09;前言一、计算机是怎么储存文字的1. 在此之前先思考一个问题2.编码表2.1 ascll码2.2unicode码2.3UTF码2.4gbk码 二、实现一个简单的string1.构造函数…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…

Flutter中使用FFI的方式链接C/C++的so库(harmonyos)

Flutter中使用FFI的方式链接C/C库&#xff08;harmonyos&#xff09; FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件&#xff1a;开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…

PDF 秒变 JPG,2024 这些工具来助力

有些扫描仪默认将扫描文档保存为PDF格式&#xff0c;若事先未加留意&#xff0c;便可能累积大量PDF文件。然而&#xff0c;在需要将这些文件插入到其他文档或进行图形设计时&#xff0c;PDF格式可能会显得不够灵活或便捷。这时&#xff0c;将PDF转换为JPG图片格式就成为了一个实…

9.C++程序中的选择语句

选择语句一共分为两种&#xff1a;条件语句和开关语句 其中条件语句叫if语句&#xff0c;常见的形式为&#xff1a;if ... else ... ; 再复杂一些为if... else if ... else ... ; 开关语句又叫switch语句&#xff0c;类型于开关的使用形式常见的有 switch (var) case : ... b…

ai写论文哪个软件好?分享4款ai论文写作工具软件

在当前的学术研究和论文写作领域&#xff0c;AI技术的应用已经成为一种趋势。AI论文写作工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是四款值得推荐的AI论文写作工具软件&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 传送…

Cluade 3.5 Sonnet 提示词泄露

prompt 翻译&#xff1a; The notebook currently demonstrates support for a two agent setup. Support for GroupChat is currently in development.

EF Core优化技巧之预热处理

1. 前言 今天和听到同事们在讨论一个关于使用EFCore时&#xff0c;为什么第一次查询数据库总是很慢的原因。我们在工作中经常使用EFCore进行数据访问&#xff0c;但发现每次第一次查询都需要较长的时间&#xff0c;这给我们带来了困扰。因此&#xff0c;我们聚在一起&#xff…

Redis实战--Redis应用过程中出现的热门问题及其解决方案

Redis作为一种高性能的key-value数据库&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。然而&#xff0c;在实际应用中&#xff0c;随着业务规模的不断扩大和访问量的持续增长&#xff0c;缓存系统也面临着诸多挑战&#xff0c;其中最为典型的便是缓存穿透、缓存击穿和缓…

Ansible集群服务部署案例

案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统&#xff0c;分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…

shell用文件管理备份文件路径

从文件中读取文件路径 while IFS read -r s; do&#xff1a;这行代码启动一个 while 循环&#xff0c;逐行读取 001.sh 文件的内容。 IFS&#xff1a;将内部字段分隔符&#xff08;IFS&#xff09;设置为空&#xff0c;确保读取整行而不被默认的空格和换行符分隔。这样可以保…

知识管理数据库

知识管理数据库&#xff0c;可以分为几类&#xff1a; 灵感库、卡片库、作品库。 灵感库&#xff0c;通常是素材&#xff0c;想法。 片库&#xff0c;是完整的&#xff0c;成段落的文字。 作品库&#xff0c;是文章、专栏&#xff0c;或者书籍。 这三者的关系&#xff0c;好比…

java通过webhook给飞书发送群消息

现在使用飞书的人越来越多了&#xff0c;飞书有一个最大的好处&#xff0c;可以使用webhook简便的发送群消息。而在工作中&#xff0c;也经常会因为一些运维方面的工作&#xff0c;需要给飞书发送群消息&#xff0c;来实时提醒相关负责人,及时处理工作。 一、先看一下效果吧&a…