设计一套全站请求耗时统计工具
首先我们要知道有哪些方式可以统计前端请求耗时
从代码层面上统计全站所有请求的耗时方式主要有以下几种:
- Performance API:Performance API 是浏览器提供的一组 API,可以用于测量网页性能。通过 Performance API,可以获取页面各个阶段的时间、资源加载时间等。其中,Performance Timing API 可以获取到每个资源的加载时间,从而计算出所有请求的耗时。
- XMLHttpRequest 的 load 事件:在发送 XMLHttpRequest 请求时,可以为其添加 load 事件,在请求完成时执行回调函数,从而记录请求的耗时。
- fetch 的 Performance API:类似 XMLHttpRequest,fetch 也提供了 Performance API,可以通过 Performance API 获取请求耗时。
- 自定义封装的请求函数:可以自己封装一个请求函数,在请求开始和结束时记录时间,从而计算请求耗时。
设计一套前端全站请求耗时统计工具
可以遵循以下步骤:
- 实现一个性能监控模块,用于记录每个请求的开始时间和结束时间,并计算耗时。
- 在应用入口处引入该模块,将每个请求的开始时间记录下来。
- 在每个请求的响应拦截器中,记录响应结束时间,并计算请求耗时。
- 将每个请求的耗时信息发送到服务端,以便进行进一步的统计和分析。
- 在服务端实现数据存储和展示,可以使用图表等方式展示请求耗时情况。
- 对于请求耗时较长的接口,可以进行优化和分析,如使用缓存、使用异步加载、优化查询语句等。
- 在前端应用中可以提供开关,允许用户自主开启和关闭全站请求耗时统计功能。
以下是一个简单的实现示例:
// performance.js const performance = { timings: {}, config: { reportUrl: '/report', }, init() { // 监听所有请求的开始时间 window.addEventListener('fetchStart', (event) => { this.timings[event.detail.id] = { startTime: Date.now(), }; }); // 监听所有请求的结束时间,并计算请求耗时 window.addEventListener('fetchEnd', (event) => { const id = event.detail.id; if (this.timings[id]) { const timing = this.timings[id]; timing.endTime = Date.now(); timing.duration = timing.endTime - timing.startTime; // 将耗时信息发送到服务端 const reportData = { url: event.detail.url, method: event.detail.method, duration: timing.duration, }; this.report(reportData); } }); }, report(data) { // 将耗时信息发送到服务端 const xhr = new XMLHttpRequest(); xhr.open('POST', this.config.reportUrl); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); }, }; export default performance;
在应用入口处引入该模块:
// main.js import performance from './performance'; performance.init();
在每个请求的响应拦截器中触发 fetchEnd
事件:
// fetch.js import EventBus from './EventBus'; const fetch = (url, options) => { const id = Math.random().toString(36).slice(2); const fetchStartEvent = new CustomEvent('fetchStart', { detail: { id, url, method: options.method || 'GET', }, }); EventBus.dispatchEvent(fetchStartEvent); return window.fetch(url, options) .then((response) => { const fetchEndEvent = new CustomEvent('fetchEnd', { detail: { id, url, method: options.method || 'GET', }, }); EventBus.dispatchEvent(fetchEndEvent); return response; }); }; export default fetch;
在服务端实现数据存储和展示,可以使用图表等方式展示请求耗,参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Resource_Timing_API/Using_the_Resource_Timing_API
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论