瀏覽器渲染過程

最近工做閒下來了,恰巧最近在研究前端性能優化相關的問題。讀到不少書籍、以及之前公司分享的一些相關資料。這裏將它們總結起來,以便你們學習。咱們的目標是:沒有白屏,對!沒有白屏。html

如下是在同一臺機器,相同網絡環境的一個測試:前端

你們都知道,瀏覽器產生白屏。是由於UI在渲染過程當中被阻塞了。那麼問題來了,是什麼阻塞了它呢?web

 

渲染過程瀏覽器

i.渲染是以流式進行的。不須要獲得所有數據再渲染,如:HTML文件下載多少就渲染多少;緩存

ii.大多數HTML外部資源都不會阻塞UI線程,如:CSS、IMG、Flash等,沒有load完畢的圖片會留一個空位置在那裏;性能優化

iii.大多數的HTML元素都是渲染出DOM便馬上顯示的;網絡

iiii.HTML從上到下解析,該過程不可逆(參考 i)。但會出現reflow(重排) and repaint(重繪)。前端性能

 

咱們訪問一個站點的時候瀏覽器會先檢查自身緩存,在沒有緩存的狀況下,瀏覽器會這樣去渲染咱們的頁面,如下面的代碼爲例:性能

 

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>myTitle</title>
</head>
<body>
    <div id="myDiv">
        <script>
            $.write('寫點什麼。');
        </script>
    </div>
</body>
</html>
複製代碼

這個時候,瀏覽器會暫停渲染HTML,將script交給js引擎編譯執行。js會建立textNode:學習

爲了更直觀的表現整個過程,我畫了這麼一張ppt,但願能幫助您理解:

HTML解析是這樣一個循環的過程, 那麼留個問題給你們:若是JavaScript不阻塞UI線程會發生什麼呢?你們能夠用以下代碼測試一下:

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>myTitle</title>
</head>
<body>
    <div id="myDiv">
        <script>
            window.setTimeout(function(){
                $.write('寫點什麼。');
            }, 0);
        </script>
    </div>
</body>
</html>
複製代碼

問題很嚴重有木有!!!!so....咱們的結論是:由於JavaScript有改變UI的能力,因此它必須UI渲染線程。

瞭解瀏覽器渲染頁面的過程,對咱們作性能優化很是重要,固然,咱們要作好性能優化須要瞭解的遠不止這些,在接下來的章節當中我會陸續更新更多關於web性能相關的文章,幫助你們瞭解它的工做模式。固然,本文描述還不夠詳盡,因此歡迎你們對本文內容勘誤、補充。以避免誤人子弟。同時,有任何不懂的,也歡迎您在評論中提出,我將盡力回覆你們,與你們一塊兒討論、一塊兒成長。

 

瀏覽器下載腳本過程

chromium 是這樣解析的:

個別步驟解釋:

MainResourceLoader::loadNow :  下載文件

PageGroupLoadDeferrer deferrer(m_page ,true) : 將腳本加入page流