qoe-pps
Version:
this is a qoe project of pps
82 lines (71 loc) • 3.01 kB
JavaScript
import usertiming from 'usertiming'
import {byName, byRegExp} from './entries'
import {global} from './global'
const FIRST_PAGE_MARK = 'firstPage'
export function getUniversal (entries, firstPaint) {
const _timing = usertiming.timing || {}
const _navigation = usertiming.timing || {}
const timing = byName(FIRST_PAGE_MARK)[0]
const navigator = global.navigator || {}
const connection = navigator.connection || navigator.mozConnection
const browserVersion = navigator.appVersion.replace(/.*AppleWebKit\/([\w.]+).*\..*/, '$1')
return {
docLoad: _timing.responseEnd - _timing.navigationStart, // 内容加载时间
analysisStart: _timing.domLoading - _timing.navigationStart, // 开始解析dom树的时间
domComplete: _timing.domComplete - _timing.navigationStart, // 解析dom树的时间(包括资源就绪)
responseStart: _timing.responseStart - _timing.navigationStart, // 读取页面第一个字节的时间
analysisEnd: _timing.domInteractive - _timing.navigationStart, // 完成解析dom树的时间(只解析dom树,并没有开始加载网页内的资源)
syncJsAndCssOn1stPage: calculate(entries).duration,
firstPaint: firstPaint,
firstPage: timing ? timing.startTime : null,
networkInfomation: connection ? connection.effectiveType : '', // 用户网络情况
browserVersion,
lookupDomain: _timing.domainLookupEnd - _timing.domainLookupStart, // DNS查询时间
appcache: _timing.domainLookupStart - _timing.fetchStart, // DNS缓存时间,fetchStart:浏览器准备好使用 HTTP 请求抓取文档的时间
connect: _timing.connectEnd - _timing.connectStart, // TCP 建立连接完成握手的时间
accessType: _navigation.type // 访问页面的方式 0:正常进入页面,1: reload()刷新进入,2:浏览器的前进后退 3:非以上方式
}
}
export function getJS () {
const HM_REGEXP = /\/\/hm\.baidu\.com\/hm\.js\?5df871ab99f94347b23ca224fc7d013f/
const IRT_REGEXP = /\/\/iqiyi\.irs01\.com\/irt/
const ADS_REGEXP = /\/\/static\.iqiyi\.com\/js\/common\/ares-/
const common = {
hm: HM_REGEXP,
irt: IRT_REGEXP,
ads: ADS_REGEXP
}
for (let o in common) {
common[o] = calculate(byRegExp(common[o])).duration
}
return common
}
export function getAjax (ajaxes) {
let arr = []
let calc
ajaxes.forEach(function (ajax) {
arr = arr.concat(byRegExp(ajax))
})
calc = calculate(arr)
return {
ajaxConsuming: calc.duration,
ajaxReady: calc.LastResponse
}
}
export function calculate (timings) {
const ret = {
duration: -1,
LastResponse: -1
}
let arr = []
if (Object.prototype.toString.call(timings) === '[object Array]') {
timings.forEach(function (timing) {
timing.startTime > 0 && arr.push(timing.startTime)
timing.responseEnd > 0 && arr.push(timing.responseEnd)
})
const max = Math.max.apply(Math, arr)
ret.duration = max - Math.min.apply(Math, arr)
ret.LastResponse = max
}
return ret
}