性能监控与上报
一、认识
在进行微前端性能监控设计之前,我们经常用于衡量 Web
性能的指标:
FCP
(First Contentful Paint
) 从页面开始加载到内容的任何部分呈现在屏幕上的时间,首次内容绘制FCP
指标衡量从页面开始加载到页面内容的任何部分呈现在屏幕上的时间。对于此指标, 内容是指文本、图像(包括背景图像)、<svg>
元素或非白色 canvas
元素。FCP
计算方式: 从页面开始加载持续检测页面中的元素,当页面中首次呈现出内容时停止检测,上报首次元素渲染的时间。
new PerformanceObserver((entryList)=>{
for(const entry of entryList.getEntriesByName('first-contentful-paing')){
console.log('FCP candiate:', entry.startTime, entry)
}
}).observe({ type: 'paint', buffered: true });
LCP
(Largest Contentful Paing
) 指标报告视口中可见的最大图像或文本块的渲染时间。(相对于页面首次开始加 载的时间)。LCP
计算方式: 从页面开始渲染持续检测页面中用户关注的内容: 文本、图片、svg
、video
,在用户进行操作前(点击、滚动、键盘)持续收集重要元素,并根据元素的大小计算出最大元素并上报
new PerformanceObserver((entryList)=>{
for(const entry of entryList.getEntries()){
console.log("LCP candiate", entry.startTime, entry);
}
}).observe({ type: 'largest-contentful-paint', buffered: true });
通过对于 FCP
、LCP
的了解, 可以发现 FCP
、LCP
都适合用来衡量整个页面首次打开的性能,但是无法衡量微前端子应用的性能。因为微前端子应用通常为页面的一部分内容,而且这部分内容可能是通过点击事件、或路由跳转触发加载,那么如何有效的衡量页面部分内容渲染性能,或者从整个页面渲染过程中微前端应 用在整个过程中占用的耗时是观察微前端应用的重要指标。
总结: 由于微前端架构的原因, 常用的性能指标 FP
、FCP
、LCP
是从整个应用的角度为检测对象,并不能很好衡量单个子应用的真实性能情况。
1.1 为微前端场景定义新指标
在微前端场景下,根据 FCP
、LCP
的实现特征我们同样可以为微前端渲染区域的内容定义 FCP
、LCP
等性能指标,用于观测从事件、路由跳转等行为开始加载微应用到微应用渲染区域 FCP
、LCP
, 与页面中的 FCP
、LCP
含义不同,它的时间更多的是从 loadSubApp
时间节点开始到微应用渲染区域出现 FCP
和 LCP
元素的时间。根据微前端应用的特征,我们定义出如下新的指标:
-
load_app_time
(load application time
): 为微前端子应用加载资源的耗时时间 -
mount_app_time
(mount application time
): 为微前端子应用代码执行到触发mount
函数中的render
逻辑耗时 -
TTFMP
(Time to First Meaningful Paint
): 为微前端子应用核心元素渲染完成的时间点 -
MFFP
(Micro Front-end First Paint
) -
MFFCP
(Micro front-end First Contentful Paint
): 为微前端子应 用首次渲染内容(文本、图片、带背景图的内容)的时间点 -
MFLCP
(Micro front-end Largest Contentful Paint
): 为微前端子应用最大内容绘制的时间点
总结: SDK
上报的性能指标 FP
、FCP
、LCP
这些和 MFFP
、MFFCP
、MFLCP
指标的关系:
-
FP
、FCP
、LCP
是站在主应用+
子应用整个页面维度的数据 -
MFFP
、MFFCP
、MFLCP
是站在子应用开始渲染到最终展示的维度的指标
二、load_app_time
2.1 认识
load_app_time
(load application time
) 是微前端子应用加载资源的耗时时间。它统计的维度是从开始加载子应用资源到子应用加载完成后的时间点。注意这里的耗时:
-
JS Entry
: 为HTML
里的资源地址加载时间 -
HTML Entry
: 为JS
入口文件的加载时间
因此, 都不包含子应用内拆分成异步 chunk
后动态加载的 script
时间。
2.2 优化
如何基于 load_app_time
指标优化?: 若遇到 load_app_time
指标比较差的情况, 可以通过 network
筛选出子应用的资源内容, 重点关注 html
入口中的资源加载耗时, js
入口中的 js
加载耗时。
三、mount_app_time
3.1 认识
mount_app_time
(mount application time
) 是微前端子应用代码执行到触发 mount
函数中的 render
逻辑耗时。注意这里的耗时:
-
JS Entry
: 渲染时间为子应用入口JS
执行到mount.render
渲染耗时 -
HTML Entry
: 渲染时间为html
的script
执行完成时间到触发mount.render
完成的时间。在开启缓存模式后第二次渲染应用仅为mount.render
时间
注意, 这里的 render
耗时并不包括框架里渲染的异步任务,例如组件中的接口请求等。