瀏覽器F12 Finish DOMContentLoaded load時間如何計算出來?
http://www.cnblogs.com/longm/...
計算白屏時間
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>白屏</title>
<script type="text/javascript">
// 不兼容performance.timing 的瀏覽器,如IE8
window.pageStartTime = Date.now();
</script>
<!-- 頁面 CSS 資源 -->
<link rel="stylesheet" href="common.css">
<link rel="stylesheet" href="page.css">
<script type="text/javascript">
// 白屏時間結(jié)束點
window.firstPaint = Date.now();
</script>
</head>
<body>
<!-- 頁面內(nèi)容 -->
</body>
</html>
因此白屏時間則可以這樣計算出:
可使用 Performance API 時
白屏時間 = firstPaint - performance.timing.navigationStart;
首屏時間
通常計算首屏的方法有
首屏模塊標簽標記法
統(tǒng)計首屏內(nèi)加載最慢的圖片的時間
自定義首屏內(nèi)容計算法
1、首屏模塊標簽標記法
首屏模塊標簽標記法,通常適用于首屏內(nèi)容不需要通過拉取數(shù)據(jù)才能生存以及頁面不考慮圖片等資源加載的情況。我們會在 HTML 文檔中對應首屏內(nèi)容的標簽結(jié)束位置,使用內(nèi)聯(lián)的 JavaScript 代碼記錄當前時間戳。如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首屏</title>
<script type="text/javascript">
window.pageStartTime = Date.now();
</script>
<link rel="stylesheet" href="common.css">
<link rel="stylesheet" href="page.css">
</head>
<body>
<!-- 首屏可見模塊1 -->
<div class="module-1"></div>
<!-- 首屏可見模塊2 -->
<div class="module-2"></div>
<script type="text/javascript">
window.firstScreen = Date.now();
</script>
<!-- 首屏不可見模塊3 -->
<div class="module-3"></div>
<!-- 首屏不可見模塊4 -->
<div class="module-4"></div>
</body>
</html>
時首屏時間等于 firstScreen - performance.timing.navigationStart;
事實上首屏模塊標簽標記法 在業(yè)務中的情況比較少,大多數(shù)頁面都需要通過接口拉取數(shù)據(jù)才能完整展示,因此我們會使用 JavaScript 腳本來判斷首屏頁面內(nèi)容加載情況。
2、統(tǒng)計首屏內(nèi)圖片完成加載的時間
通常我們首屏內(nèi)容加載最慢的就是圖片資源,因此我們會把首屏內(nèi)加載最慢的圖片的時間當做首屏的時間。
由于瀏覽器對每個頁面的 TCP 連接數(shù)有限制,使得并不是所有圖片都能立刻開始下載和顯示。因此我們在 DOM樹 構(gòu)建完成后將會去遍歷首屏內(nèi)的所有圖片標簽,并且監(jiān)聽所有圖片標簽 onload 事件,最終遍歷圖片標簽的加載時間的最大值,并用這個最大值減去 navigationStart 即可獲得近似的首屏時間。
此時首屏時間等于 加載最慢的圖片的時間點 - performance.timing.navigationStart;
3、自定義模塊內(nèi)容計算法
由于統(tǒng)計首屏內(nèi)圖片完成加載的時間比較復雜。因此我們在業(yè)務中通常會通過自定義模塊內(nèi)容,來簡化計算首屏時間。如下面的做法:
忽略圖片等資源加載情況,只考慮頁面主要 DOM
只考慮首屏的主要模塊,而不是嚴格意義首屏線以上的所有內(nèi)容
首先你得知道瀏覽器渲染原理,DOMContentLoaded就是dom加載完畢,你打開一個網(wǎng)頁開始是空白的,然后一瞬間之內(nèi)容會展示出來,從空白頁到到展示內(nèi)容會觸發(fā)DOMContentLoaded
這時候問題又來了,什么是HTML文檔被加載和解析完成。要解決這個問題,我們就必須了解瀏覽器渲染原理。
當我們在瀏覽器地址輸入URL時,瀏覽器會發(fā)送請求到服務器,服務器將請求的HTML文檔發(fā)送回瀏覽器,瀏覽器將文檔下載下來后,便開始從上到下解析,解析完成之后,會生成DOM。如果頁面中有css,會根據(jù)css的內(nèi)容形成CSSOM,然后DOM和CSSOM會生成一個渲染樹,最后瀏覽器會根據(jù)渲染樹的內(nèi)容計算出各個節(jié)點在頁面中的確切大小和位置,并將其繪制在瀏覽器上。
html的解析又會被js打斷,解析過程中遇到<script>標簽的時候,便會停止解析過程,轉(zhuǎn)而去處理腳本,如果腳本是內(nèi)聯(lián)的,瀏覽器會先去執(zhí)行這段內(nèi)聯(lián)的腳本,如果是外鏈的,那么先會去加載腳本,然后執(zhí)行。在處理完腳本之后,瀏覽器便繼續(xù)解析HTML文檔。
所以一般js文件放到最后面
這里需要注意一點,在現(xiàn)在瀏覽器中,為了減緩渲染被阻塞的情況,現(xiàn)代的瀏覽器都使用了猜測預加載。當解析被阻塞的時候,瀏覽器會有一個輕量級的HTML(或CSS)掃描器(scanner)繼續(xù)在文檔中掃描,查找那些將來可能能夠用到的資源文件的url,在渲染器使用它們之前將其下載下來。
在這里我們可以明確DOMContentLoaded所計算的時間,當文檔中沒有腳本時,瀏覽器解析完文檔便能觸發(fā) DOMContentLoaded 事件;如果文檔中包含腳本,則腳本會阻塞文檔的解析,而腳本需要等位于腳本前面的css加載完才能執(zhí)行。在任何情況下,DOMContentLoaded 的觸發(fā)不需要等待圖片等其他資源加載完成。
參考:click here
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。