上回書說到,前戲作足,因而咱們採起了
rollup
來打包咱們的js-sdk
,那麼工具都有了,就要準備正事了。javascript
本篇內容是連續,建議收藏,開篇會有前幾篇連接。開此專題會帶領你們如何開發一個真正的,有意義的性能分析系統,而不是單純的炫技。html
性能分析,首要的就是數據,本期就帶你們在數據的海洋裏撈針。前端
前情回顧:性能分析(一)前戲:用 rollup 打包一個 js-sdkjava
Performance - Web APIs | MDNnode
PerformanceAPI
是使用最多的,經過這個 api,咱們能夠採集到頁面的不少數據,例如domComplete
DOM 完成時間,domInteractive
DOM 可交互時間等等。ios
const [pagePerformance] = performance.getEntries();
console.log(pagePerformance);
複製代碼
能夠看到,pagePerformance
是個很是大的對象,咱們來分析一下這個對象。git
參數 | 翻譯 | 含義 |
---|---|---|
startTime |
開始時間 | 表示整個 document 資源開始的時間,通常爲 0 |
redirectStart |
重定向時間 | 表示開始重定向的時間(若是沒有則爲 0) |
redirectEnd |
重定向結束時間 | 表示結束重定向的時間(若是沒有則爲 0) |
redirectCount |
重定向次數 | 表示產生重定向的次數 |
fetchStart |
請求開始時間 | 表示客戶端開始準備請求的時間 |
domainLookupStart |
創建DNS 開始 |
表示DNS 開始創建的時間 |
domainLookupEnd |
DNS 創建結束 |
表示DNS 創建成功的時間 |
connectStart |
創建TCP 開始 |
表示TCP 鏈接開始創建的時間 |
secureConnectionStart |
HTTPS 創建時間 |
若是有HTTPS ,則記錄HTTPS 創建開始時間 |
connectEnd |
TCP 創建結束 |
表示TCP 鏈接創建成功的時間 |
requestStart |
資源開始請求時間 | 表示資源開始請求的時間 |
responseStart |
首字節到達時間ttfb |
表示服務端返回第一個字節記錄的時間 |
responseEnd |
資源徹底抵達時間 | 表示資源徹底抵達,dom 開始渲染 |
domInteractive |
dom 可交互時間 |
表示dom 渲染進入可交互時間 |
domContentLoadedEventStart |
domContentLoaded 事件觸發時間 |
表示 domContentLoaded 事件觸發的時間 |
domContentLoadedEventEnd |
domContentLoaded 事件完成觸發時間 |
表示 domContentLoaded 事件結束觸發的時間 |
domComplete |
dom 完成的時間 |
表示dom 完成的時間 |
nextHopProtocol |
http 協議 |
- |
這一個大表看下來,你們會以爲,東西太亂太雜了,是的,由於沒有通過加工的數據,就是雜亂無章的,因此咱們稍微整理一下。首先咱們須要知道,頁面加載的流程是什麼,通過我不懈努力的尋找,獲得下面這個圖github
按照上圖,咱們能夠獲得新的結構(這裏的時間是毫秒時間,eg: 14.644999988377094 ms)算法
參數 | 翻譯 | 算法 |
---|---|---|
startTime |
開始時間 | startTime || fetchStart |
redirect |
重定向時間 | redirectEnd-redirectStart |
dns |
DNS 創建時間 | domainLookupEnd-domainLookupStart |
tcp |
TCP 創建時間 | connectEnd-connectStart |
response |
資源加載時間 | responseEnd-requestStart (注意這裏是response-request ) |
interactive |
可交互時間 | domInteractive-responseEnd |
content |
內容加載時間 | domContentLoadedEventEnd-domContentLoadedEventStart |
complete |
dom 完成時間 | domComplete-responseEnd |
nextHopProtocol |
http 協議 |
- |
新的結構看起來就舒服多了,咱們能夠看到,有些數據是表示間隔,有些數據則是同一個timeline
,那麼這張圖,咱們獲得一個新的性能分析timing
圖以下所示:npm
既然知道須要收集什麼數據,咱們就開始着手行動
perormance timing
數據經過user-agent
咱們能夠解析上述信息,這裏我提供給你們兩個不錯的解析工具,固然網上也能夠搜到不少相關資料,暫不贅述。
UAParser.js A JavaScript-based User-Agent string parser. Can be used either in browser (client-side) or in node.js (server-side) environment.
useragent.js A User-agent analyze project.
利用window.screen
提供的width
和height
便可
import UAParser from 'ua-parser-js';
import axios from 'axios';
class FirstPaintTiming {
get requestUrl() {
return (
{
test: 'https://ihap.txdy.test.fakeurl/api/v1/page',
production: 'https://ihap.txdy.production.fakeurl/api/v1/page',
}[this.env] || false
);
}
constructor(options = { env: 'test' }) {
this.env = options.env;
}
upload2Server() {
try {
requestUrl && axios.post(requestUrl, [this.getPageInfo()]);
} catch {}
}
getPageInfo() {
return {
...this._getPagePerformance(),
...this._getPhysics(),
};
}
_getPagePerformance() {
const [pagePerformance] = performance.getEntries();
return {
startTime: pagePerformance.startTime || pagePerformance.fetchStart,
redirect: pagePerformance.redirectEnd - pagePerformance.redirectStart,
dns: pagePerformance.domainLookupEnd - pagePerformance.domainLookupStart,
tcp: pagePerformance.connectEnd - pagePerformance.connectStart,
response: pagePerformance.responseEnd - pagePerformance.requestStart,
interactive: pagePerformance.domInteractive - pagePerformance.responseEnd,
content:
pagePerformance.domContentLoadedEventEnd - pagePerformance.domContentLoadedEventStart,
complete: pagePerformance.domComplete - pagePerformance.responseEnd,
nextHopProtocol: pagePerformance.nextHopProtocol,
};
}
_getPhysics() {
const uaParser = new UAParser().getResult();
const { name: browserName, version: browserVersion } = uaParser.browser;
const { name: osName, version: osVersion } = uaParser.os;
return {
os: `${browserName}${browserVersion}`,
browser: `${osName}${osVersion}`,
};
}
}
複製代碼
本期,咱們講了數據從何而來以及數據採集的方法,可是實現一個性能分析的js-sdk
咱們目前仍然缺乏一些關鍵的內容:
下次咱們會進入慢熱節奏,着重講述上報策略與統一上報接口的內容。請你們拭目以待!我是 ihap 技術黑洞的 ihap 肥少,歡迎點贊打賞,也請你們關注咱們的公衆號,ihap 技術黑洞。
參考文獻
www.cnblogs.com/lzbk/p/6330… 前端頁面性能參數蒐集 www.w3.org/TR/navigati… Navigation Timing developer.mozilla.org/en-US/docs/… Performance - Web APIs | MDN