js检测页面性能指标
检测获取fp、fcp、lcp、cls性能指标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | window.monitor = { isWinLoad: false , observer: null , sessionValue: 0, sessionEntries: [], data: { fp: 0, fcp: 0, lcp: 0, cls: 0 } } /** PerformanceObserver类进行监听 */ window.monitor.observer = new PerformanceObserver( function (list) { for (const entry of list.getEntries()) { // lcp获得 if (entry.entryType === 'largest-contentful-paint' ) { window.monitor.data.lcp = entry.startTime } // cls计算 if (entry.entryType === 'layout-shift' ) { // 只计算没有最近用户输入的布局移位。 if (!entry.hadRecentInput) { const firstSessionEntry = window.monitor.sessionEntries[0] const lastSessionEntry = window.monitor.sessionEntries[window.monitor.sessionEntries.length - 1] // 如果该条目发生在前一个条目之后不到1秒,且在会话中的第一个条目之后不到5秒,则将该条目包含在当前会话中。否则,开始一个新的会话。 if ( window.monitor.sessionValue && entry.startTime - lastSessionEntry.startTime < 1000 && entry.startTime - firstSessionEntry.startTime < 5000 ) { window.monitor.sessionValue += entry.value window.monitor.sessionEntries.push(entry) } else { window.monitor.sessionValue = entry.value window.monitor.sessionEntries = [entry] } // 如果当前会话值大于当前CLS值,则更新CLS及其表项。 if (window.monitor.sessionValue > window.monitor.data.cls) { window.monitor.data.cls = window.monitor.sessionValue } } } // fp、fcp获得 if (entry.entryType === 'paint' ) { if (entry.name === 'first-paint' ) { window.monitor.data.fp = entry.startTime } if (entry.name === 'first-contentful-paint' ) { window.monitor.data.fcp = entry.startTime } } } }) /** entryTypes还有其他类型,这里只监听三个类型 buffered 属性表示是否观察缓存数据,也就是说观察代码添加时机比事情触发时机晚也没关系。 */ window.monitor.observer.observe( { entryTypes: [ 'paint' , 'largest-contentful-paint' , 'layout-shift' ], buffered: true } ) window.addEventListener( 'load' , function () { window.monitor.isWinLoad = true }, true ) window.addEventListener( 'beforeunload' , function () { if (window.monitor.isWinLoad) { console.log(window.monitor) /** beforeunload应该选择什么样的方式进行传输上报? 异步ajax是不可靠的,无非保证上报。 可选择方式有以下几种: 1、同步ajax 同步ajax会阻断浏览器的unload,直到ajax环节结束后才会继续进行unload。 此方法的缺点是由于页面会在ajax请求结束后才延迟卸载,会导致关闭时浏览器出现卡顿降低用户的体验。 注意:chrome不支持在页面关闭事件内使用同步XMLHttpRequest请求 2、beacon beacon api设计就是用来解决页面卸载时发送请求的问题。他能保证在页面unload完成前请求能够被发送,并且由于其是异步且非阻塞的,并不会影响浏览器其他页面的显示效率。 sendBeacon只能发送http post请求。 问题:此方法无法自定义header信息,如果服务端设置了token权限拦截,sendBeacon并没有办法将token信息放入请求中。 3、fetch fetch方法配合参数中的keepalive字段会让浏览器在页面卸载后在后台继续接管网络请求,该字段是必须的。 此方法的缺陷为keepalive字段一次只能承载最大64KB的请求内容,且该限制是所有并行请求共享的,即,页面卸载阶段所有fetch+keepalive请求的内容体总和不能超过64KB。 4、创建img携带信息 此方法是get请求方式将参数传递,get参数本身可携带信息有限,不可传递大量信息。 */ } }, true ) |
其他性能指标日后更新,参考链接https://zhuanlan.zhihu.com/p/420330110
放弃安逸,持续努力——成长
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧