12.怎样设计一个全站请求耗时的统计工具

1. 背景

通过这个统计工具,可以更清晰地看到整个站点性能情况,也可以包括首屏加载事件(FP/FCP)

  1. 监控请求耗时:HTTP、中间件、axios拦截器
  2. 前端监控,监控整个请求,记录耗时数据
  3. 后端监控,什么时候收到什么时候处理好
  4. 数据汇总:数据清洗或数据加工可视化图表显示

2. 方案

2.1 ajax发送请求的监控

const originalXhrOpen=XMLHttpRequest.prototype.open

XMLHttpRequest.prototype.open=function(...args){
	 this._startTime=performance.now()
	 this.addEventListener('load',function(){
		 const duration=performance.now()-this._startTime
		 console.log(`XHR ${args[1]} took ${duration}ms`)
		 reportRequestDuration(args[1],duration,'XMR')
	 })
	 originalXhrOpen.apply(this,args)
}

const originalFetch=window.fetch

window.fetch=async function(...args){
	 const startTime=performance.now()
	 const response=await originalFetch.apply(this,args)
	 const duration =performance.now()-startTime
	 console.log(`Fetch ${args[0]} took ${duration}ms`)
	 reportRequestDuration(args[0],duration,'Fetch')
}

function reportRequestDuration(url,duration,type){
	 fetch(`/api/report-request-duration`,{
		 method:'PoST',
		 headers:{
			 'Content-Type':'application/json'
		 },
		 body:JSON.stringify({url,duration,type})
	 })
}

// 图片上报
const img=document.createElement('img')
img.src='/api/xxx?a=1'