当前位置: 首页 > article >正文

前端性能初探

前端监控

提升稳定性,更快的发现异常,定位异常,解决异常,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.kler.cn/news/325451.html

相关文章:

  • 城市生命线安全监管系统:智慧城市的守护者
  • string类的使用(上)
  • Maven-四、继承
  • 人工智能赋能产业升级!亲笔签数字笔迹AI识别技术在第二十四届工博会上大放异彩
  • 开启争对目标检测的100类数据集-信息收集
  • [001-03-007].第28节:SpringBoot整合Redis:
  • Agilent E4438C 6G产品说明书
  • cnn机器学习时python版本不兼容报错
  • 游戏怎么录制?王者荣耀游戏录制指南:iOS与电脑端全面教程
  • JavaScript异步编程:async、await的使用
  • Bug:ThreadPoolTaskScheduler搭配CronTask完成定时任务,关闭scheduler后CronTask任务仍然执行?
  • ROS学习笔记(二):鱼香ROS — 超便捷的一键安装/配置/换源指令(Ubuntu/ROS/ROS2/IDE等)
  • android和ios双端应用性能的测试工具
  • springBoot --> 学习笔记
  • 锐捷—NAT地址映射+IPsec隧道
  • 使用openpyxl轻松操控Excel文件
  • C++学习笔记(48)
  • grafana加载缓慢解决方案
  • 初学playbook,从一个简单的示例开始。
  • Vue前端浏览器指纹获取:数字世界的身份密码
  • linux常见指令与权限【第四课】
  • C语言基本语法————基本数据类型、变量与常量
  • HDFS组件相关问题-持续更新
  • Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
  • RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!
  • 【在Linux世界中追寻伟大的One Piece】进程间通信
  • 在Windows on Arm上使用Electron构建桌面应用
  • Rust和Go谁会更胜一筹
  • Day28笔记-Python自动化操作Word
  • Redis结合Caffeine实现二级缓存:提高应用程序性能