了解html頁面的渲染過程以備學(xué)習(xí)前端的性能優(yōu)化(續(xù))

昨天晚上寫了一篇關(guān)于瀏覽器的渲染過程的隨筆,但只是通過一小段代碼解釋了一下,并沒有通過瀏覽器測(cè)試,說服力不夠,而且還有很多不完善的地方,今天在瀏覽器中測(cè)試了一下,并把測(cè)試的結(jié)果分享給大家,測(cè)試過程可能有點(diǎn)亂,希望大家理解。
測(cè)試瀏覽器:Chrome v24.0.1312.52 m,F(xiàn)irefox v18.0,Opera v12.12。
在WebKit內(nèi)核中,網(wǎng)頁在顯示的時(shí)候會(huì)有一個(gè)解析器(Parser)去解析html文檔,然后去生成渲染樹(Render Tree),最終渲染出頁面。這是在一個(gè)線程中進(jìn)行的,所以兩者不會(huì)同時(shí)進(jìn)行。
我分為了以下兩種情況,并分別在不同的瀏覽器中進(jìn)行測(cè)試。
樣式文件在head里,其他的連個(gè)腳本文件一個(gè)在body的開始部分,一個(gè)在body的底部。樣式文件在body的開始部分,腳本文件的位置和上面的一樣。測(cè)試的結(jié)果是這樣的,在chrome中,樣式文件的位置會(huì)影響到圖片的下載時(shí)間,而在另外兩個(gè)瀏覽器中這兩種情況沒有區(qū)別。下面是詳細(xì)的測(cè)試過程。
測(cè)試一:樣式文件在head里,其他的連個(gè)腳本文件一個(gè)在body的開始部分,一個(gè)在body的底部。
測(cè)試的代碼:
<!doctype html>
<html>
<head>
<title>測(cè)試頁面</title>
<link rel="stylesheet" type="text/css" href="example.aspx?sleep=3" />
</head>
<body>
<div>
Hi, there!</div>
<script type="text/javascript">
document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");
</script>
<div>
Hi, again!</div>
<img src="images/marx.jpg" alt="Marx" />
<img src="images/engels.jpg" alt="Engels" />
<img src="images/Lenin.jpg" alt="Lenin" />
<script src="last.aspx" type="text/javascript"></script>
</body>
</html>
1、在Chrome中的測(cè)試情況
我在瀏覽器中打開頁面后,迅速將網(wǎng)頁截了一張圖,如下所示(點(diǎn)擊可以查看大圖,下同):
從上圖中可以看出,test.htm 文檔已經(jīng)加載完成,頁面上還沒有顯示任何東西,example.css處于pending狀態(tài),但是,位于最底部的last.js卻加載完成了。這說明chrome進(jìn)行了預(yù)加載,提前下載,放在了瀏覽器的緩存里了。雖然last.js已經(jīng)加載完成,但是還沒有被執(zhí)行,因?yàn)樗懊娴臉邮轿募?huì)阻塞腳本的執(zhí)行。
接下來,當(dāng)example.css加載完成后,Hi there!顯示在了屏幕上,瀏覽器的截圖如下所示:
通過網(wǎng)絡(luò)請(qǐng)求可以看出,example.css已經(jīng)加載完成,other.js處于pending狀態(tài),但此時(shí)script標(biāo)簽底下的三張圖片已經(jīng)下載下來了,這是由瀏覽器的預(yù)先加載的功能所致。但是由于瀏覽器的渲染被other.js腳本阻塞住,所以,這三張圖片連同它上面的“Hi again”都不會(huì)顯示出來。另外,此時(shí)last.js中的代碼還沒有執(zhí)行。
接下來,當(dāng)other.js加載完成之后,瀏覽器就會(huì)構(gòu)建出渲染樹,顯示出“Hi again”,并顯示出圖片。由于last.js先前已經(jīng)被下載,所以last.js會(huì)立即執(zhí)行。整個(gè)渲染過程完成。如下圖所示:
由此看出,Chrome會(huì)預(yù)先加載body中的腳本資源(樣式文件沒有測(cè)試),由JavaScript腳本動(dòng)態(tài)加載的JS不會(huì)影響圖片文件的下載,但是會(huì)影響它下面圖片的渲染。
2、Firefox中的測(cè)試結(jié)果
在Firefox瀏覽中打開頁面后迅速截圖,如下所示:
和在Chrome中有很明顯的不同,"Hi there!",已經(jīng)顯示在了頁面上,但是背景色是白色,說明此時(shí)樣式文件還沒有下載下來。而在Chrome中是不會(huì)顯示的,要等到樣式文件加載完成。
接下來,當(dāng)整個(gè)頁面加載完成之后,截圖如下所示:
從請(qǐng)求的瀑布流中可以看出,和Chrome類似,瀏覽器對(duì)last.js進(jìn)行了預(yù)加載,和Chrome中不同的是,火狐沒有對(duì)圖片進(jìn)行預(yù)加載,而是等到other.js加載完成之后再進(jìn)行的加載。
火狐中,樣式文件并沒有影響文檔的渲染(最典型的現(xiàn)象就是,網(wǎng)頁一開始顯示的很亂,沒有樣式,當(dāng)樣式文件下載下來之后就顯示正常了),在body中,由JavaScript動(dòng)態(tài)加載的JS文件會(huì)阻塞它后面的圖片的下載。
3、在Opera瀏覽器中
經(jīng)過在Opera中測(cè)試,發(fā)現(xiàn)Opera瀏覽器比較“守規(guī)矩”,所有的資源都是按順序加載的,并沒有出現(xiàn)所謂的預(yù)先加載,下面是一張總的效果圖:
Opera中,樣式文件會(huì)阻塞頁面的渲染,這和Chrome類似,但是,有Opera的請(qǐng)求瀑布流可以看出,頁面中的所有的資源都是按部就班的加載的,other.js提前于last.js加載。沒有預(yù)加載。
測(cè)試二、樣式文件在body的開始部分,腳本文件的位置和測(cè)試一的一樣。
復(fù)制代碼代碼如下:
<!doctype html>
<html>
<head>
<title>測(cè)試頁面</title>
</head>
<body>
<link rel="stylesheet" type="text/css" href="example.aspx?sleep=3" />
<div>
Hi, there!</div>
<script type="text/javascript">
document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");
</script>
<div>
Hi, again!</div>
<img src="images/marx.jpg" alt="Marx" />
<img src="images/engels.jpg" alt="Engels" />
<img src="images/Lenin.jpg" alt="Lenin" />
<script src="last.aspx" type="text/javascript"></script>
</body>
</html>
經(jīng)過測(cè)試,發(fā)現(xiàn)在火狐和Opera中,結(jié)果和測(cè)試一的一樣,而在Chrome中稍微有些不同,在測(cè)試一中,圖片要等到head中樣式文件加載完之后才會(huì)下載,但是測(cè)試二中會(huì)和樣式文件并行下載,如下圖:
總結(jié):
預(yù)加載確實(shí)是存在的,但是在Opera中沒有發(fā)現(xiàn);Chrome的圖片可以和body中的樣式文件并行下載,但是不能和head中樣式文件并行下載。腳本的執(zhí)行要在它前面的樣式文件加載完之后。Chrome和Opera中,未加載完的資源會(huì)阻塞它后面元素的渲染,而火狐不會(huì)。測(cè)試結(jié)果可能和瀏覽器版本有關(guān)。
看完這些,大家是不是覺得有些亂了,我想盡可能的表達(dá)明白,但是限于我水平有限,只能做到這了,不妥之處希望大家指出,大家也可以親自做一下試驗(yàn)看看。
(完)^_^
相關(guān)文章
- HTML表格用于在網(wǎng)頁上展示數(shù)據(jù),通過標(biāo)簽及其相關(guān)標(biāo)簽來創(chuàng)建,表格由行和列組成,每一行包含一個(gè)或多個(gè)單元格,單元格可以包含文本、圖像、鏈接等元素,本文將詳細(xì)介紹HTML表格2025-03-12
- 本文介紹了三種禁止HTML頁面滾動(dòng)的方法:通過CSS的overflow屬性、使用JavaScript的滾動(dòng)事件監(jiān)聽器以及使用CSS的position:fixed屬性,每種方法都有其適用場(chǎng)景和優(yōu)缺點(diǎn),感興2025-02-24
使用HTML和CSS實(shí)現(xiàn)文字鏤空效果的代碼示例
在 Web 開發(fā)中,文本的視覺效果是提升用戶體驗(yàn)的重要因素之一,通過 CSS 技巧,我們可以創(chuàng)造出許多獨(dú)特的效果,例如文字鏤空效果,本文將帶你一步一步實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文字鏤空2024-11-17Html去除a標(biāo)簽的默認(rèn)樣式的操作代碼
在Html中,a標(biāo)簽?zāi)J(rèn)的超鏈接樣式是藍(lán)色字體配下劃線,這可能不滿足所有設(shè)計(jì)需求,如需去除這些默認(rèn)樣式,可以通過CSS來實(shí)現(xiàn),本文給大家介紹Html去除a標(biāo)簽的默認(rèn)樣式的操作代碼2024-09-25HTML文本域如何設(shè)置為禁止用戶手動(dòng)拖動(dòng)
在HTML中,可以通過設(shè)置CSS的resize屬性為none,來禁止用戶手動(dòng)拖動(dòng)文本域(textarea)的大小,這種方法簡(jiǎn)單有效,適用于大多數(shù)現(xiàn)代瀏覽器,但需要在老舊瀏覽器中進(jìn)行測(cè)試以確保2024-09-25如何通過HTML/CSS 實(shí)現(xiàn)各類進(jìn)度條的功能
本文詳細(xì)介紹了如何利用HTML和CSS實(shí)現(xiàn)多種風(fēng)格的進(jìn)度條,包括基礎(chǔ)的水平進(jìn)度條、環(huán)形進(jìn)度條以及球形進(jìn)度條等,還探討了如何通過動(dòng)畫增強(qiáng)視覺效果,內(nèi)容涵蓋了使用HTML原生標(biāo)簽2024-09-19HTML中Canvas關(guān)鍵知識(shí)點(diǎn)總結(jié)
Canvas 提供了一套強(qiáng)大的 2D 繪圖 API,適用于各種圖形繪制、圖像處理和動(dòng)畫制作,可以幫助你創(chuàng)建復(fù)雜且高效的網(wǎng)頁圖形應(yīng)用,這篇文章主要介紹了HTML中Canvas關(guān)鍵知識(shí)點(diǎn)總結(jié)2024-06-03html table+css實(shí)現(xiàn)可編輯表格的示例代碼
本文主要介紹了html table+css實(shí)現(xiàn)可編輯表格的示例代碼,主要使用HTML5的contenteditable屬性,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2024-03-06HTML中使用Flex布局實(shí)現(xiàn)雙行夾批效果
本文主要介紹了HTML中使用Flex布局實(shí)現(xiàn)雙行夾批效果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)2024-02-22HTML+CSS實(shí)現(xiàn)炫酷登錄切換的項(xiàng)目實(shí)踐
在網(wǎng)站開發(fā)中,登錄頁面是必不可少的一部分,本文就來介紹一下HTML+CSS實(shí)現(xiàn)登錄切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需2024-02-02