理解關(guān)鍵的渲染路徑

當瀏覽器從服務(wù)器接收到一個HTML頁面的請求時,到屏幕上渲染出來要經(jīng)過很多個步驟得哆。瀏覽器完成這一系列的運行,或者說渲染出來我們常常稱之為 “關(guān)鍵渲染路徑”(Critical Rendering Path)翠桦。

理解CRP(Critical Rendering Path)相關(guān)的知識可以更好的提高網(wǎng)站的性能葵擎。那么理解我們從下面六個部分來理解CRP相關(guān)的知識:

  • 構(gòu)建DOM樹
  • 樹建CSSOM樹
  • 運行JavaScript
  • 創(chuàng)建Render樹
  • 生成布局
  • 繪制(Painting)
image

構(gòu)建DOM樹

DOM(文檔對象模型)樹是一個完全解析的HTML頁面對象。從<html>根元素開始到頁面中每個元素和文本的節(jié)點麸粮。元素嵌套在其他元素內(nèi)則表示為子節(jié)點溉苛,每個節(jié)點包含完整的屬性元素。例如一個元素弄诲,它就有與之相關(guān)的href節(jié)點愚战。

來看下面這個簡單的DOM示例:

<html>  
<head>  
  <title>Understanding the Critical Rendering Path</title>
  <link rel="stylesheet" href="style.css">
</head>  
<body>  
  <header>
      <h1>Understanding the Critical Rendering Path</h1>
  </header>
  <main>
      <h2>Introduction</h2>
      <p>Lorem ipsum dolor sit amet</p>
  </main>
  <footer>
      <small>Copyright 2017</small>
  </footer>
</body>  
</html>  

這將會創(chuàng)建一個像下面這樣的DOM樹:


image

HTML比較好的是它可以執(zhí)行部分。完整的文檔不需要加載的內(nèi)容會在頁面的開始呈現(xiàn)齐遵。然而寂玲,比如CSS和JavaScript可以阻止頁面的呈現(xiàn)。

構(gòu)建CSSOM樹

CSSOM(CSS對象模型)是一個表示DOM樣式的對象梗摇。它類似于DOM拓哟,但是是每個節(jié)點相關(guān)的樣式,包括他們是否顯式聲明或隱式繼承伶授。

比如断序,在style.css文件中對上面的DOM有這樣的一些樣式:

body { font-size: 18px; }

header { color: plum; }  
h1 { font-size: 28px; }

main { color: firebrick; }  
h2 { font-size: 20px; }

footer { display: none; } 

這將會構(gòu)建像下面這樣的一個CSSOM樹:

image

CSS被認為是 “渲染阻塞資源”流纹。這意味著渲染樹(見下文)的構(gòu)建離不開延續(xù)一個資源的解析完成度。不像HTML违诗,CSS不能只用部分捧颅,因為CSS是具有繼承層疊特性。文檔后面定義的樣式可以覆蓋前面定義的樣式较雕。所以,如果我們開始使用CSS時挚币,之前的樣式表會被認為已經(jīng)全部解析完亮蒋。這也意味著CSS必須充分解析才能繼續(xù)下一個階段。

如果只運用于當前設(shè)備妆毕,CSS文件只被認為阻塞慎玖。==<link rel="stylesheet">== 標簽可以接受一個media屬性,可以用來指定樣式適用于何種媒體笛粘。例如趁怔,我們有一個樣式表,它的media屬性設(shè)置為orientation:landscape時薪前,如果在portrait模式下查看頁面润努,那么這個樣式表不會被認為是一個阻塞資源。

CSS還會阻塞JavaScript示括。那是因為JavaScript文件必須要等CSSOM構(gòu)建完才會執(zhí)行铺浇。

運行JavaScript

JavaScript被認為是一個 “解析器阻塞資源”。這意味著解析的HTML文檔本身就會被JavaScript阻塞垛膝。

當解析器讀到<script>標記鳍侣,不管是內(nèi)部的還是外部的,它停止獲群鹩怠(如果是外部的)并運行它倚聚。這個為什么,如果我們有一個JavaScript文件凿可,該文件引用文檔中的元素惑折,那么它必須放在這個元素的后面。

為了避免JavaScript解析器造成阻塞矿酵,可以添加==async==屬性唬复,異步加載它。

<script async src="script.js">  

創(chuàng)建Render樹

Render樹是DOM和CSSOM的組合全肮。這個樹代表最終在頁面上呈現(xiàn)的東西敞咧。這意味著它只抓住了可見的內(nèi)容,將不包括設(shè)置了hidden的元素和CSS設(shè)置了display:none的元素辜腺。

使用上面的DOM和CSSOM休建,構(gòu)建的Render樹如下圖所示:

image

生成布局

布局根據(jù)CSS樣式設(shè)置的大小來決定頁面在窗口中的尺寸乍恐。視窗的大小是由<head>中viewport標記來決定,如果沒有提供這個標記测砂,默認使用的視窗寬度是980px茵烈。

例如,常見的設(shè)置視窗的meta標簽砌些,指定的大小對應(yīng)設(shè)備寬度:

<meta name="viewport" content="width=device-width,initial-scale=1">  

如果用戶訪問頁面寬度是基于設(shè)備的寬度1000px呜投。那一半的視窗就是500px,10vw就是100px存璃。

繪制(Painting)

最后就是繪制(Painting)步驟仑荐,把頁面可見的內(nèi)容轉(zhuǎn)化為像素在屏幕上顯示。

繪制需要多少時間這取決于DOM的大小以及應(yīng)用的樣式纵东。有一些樣式需要更多的執(zhí)行時間粘招。例如,一個復(fù)雜的漸變背景圖像比一個單一顏色背景繪制需要更多的時間偎球。

把它們結(jié)合起來

我們可以在DevTools中看到關(guān)鍵渲染路徑的過程洒扎。在Chrome瀏覽器中,點擊Timeline選項衰絮。

拿文章前面的示例(這里添加了<script>標簽):

<html>  
<head>  
  <title>Understanding the Critical Rendering Path</title>
  <link rel="stylesheet" href="style.css">
</head>  
<body>  
  <header>
      <h1>Understanding the Critical Rendering Path</h1>
  </header>
  <main>
      <h2>Introduction</h2>
      <p>Lorem ipsum dolor sit amet</p>
  </main>
  <footer>
      <small>Copyright 2017</small>
  </footer>
  <script src="main.js"></script>
</body>  
</html>  

如果我們看頁面的加載日志袍冷,將看到如下這樣的數(shù)據(jù):

image
  • 發(fā)送請求:發(fā)送GET,請求index.html
  • 解析HTML并發(fā)送請求:解析HTML并且構(gòu)建DOM樹猫牡,發(fā)送GET請求难裆,請求style.css和main.js
  • 解析樣式:根據(jù)style.css創(chuàng)建CSSOM
  • 腳本評估:main.js評估
  • 布局:基于HTML中的視窗meta生成布局
  • 繪制:繪制頁面

基于這些信息,我們可以決定如何優(yōu)化關(guān)鍵渲染路徑镊掖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乃戈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亩进,更是在濱河造成了極大的恐慌症虑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件归薛,死亡現(xiàn)場離奇詭異谍憔,居然都是意外死亡,警方通過查閱死者的電腦和手機主籍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門习贫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人千元,你說我怎么就攤上這事苫昌。” “怎么了幸海?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵祟身,是天一觀的道長奥务。 經(jīng)常有香客問我,道長袜硫,這世上最難降的妖魔是什么氯葬? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮婉陷,結(jié)果婚禮上帚称,老公的妹妹穿的比我還像新娘。我一直安慰自己秽澳,他們只是感情好世杀,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肝集,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛛壳。 梳的紋絲不亂的頭發(fā)上杏瞻,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音衙荐,去河邊找鬼捞挥。 笑死,一個胖子當著我的面吹牛忧吟,可吹牛的內(nèi)容都是我干的砌函。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼溜族,長吁一口氣:“原來是場噩夢啊……” “哼讹俊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煌抒,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仍劈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寡壮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贩疙,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年况既,在試婚紗的時候發(fā)現(xiàn)自己被綠了这溅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡棒仍,死狀恐怖悲靴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫其,我是刑警寧澤对竣,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布庇楞,位于F島的核電站,受9級特大地震影響否纬,放射性物質(zhì)發(fā)生泄漏吕晌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一临燃、第九天 我趴在偏房一處隱蔽的房頂上張望睛驳。 院中可真熱鬧,春花似錦膜廊、人聲如沸乏沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬跃。三九已至,卻和暖如春铆铆,著一層夾襖步出監(jiān)牢的瞬間蝶缀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工薄货, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翁都,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓谅猾,卻偏偏與公主長得像柄慰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子税娜,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 當瀏覽器接收到從服務(wù)器發(fā)送過來的HTML頁面信息,在將其繪畫渲染到屏幕上之前會有許多的步驟要做敬矩。瀏覽器繪制頁面需要...
    單純的土豆閱讀 924評論 0 2
  • 大家都知道萬維網(wǎng)的應(yīng)用層使用了HTTP協(xié)議薯蝎,并且用瀏覽器作為入口訪問網(wǎng)絡(luò)上的資源。用戶在使用瀏覽器訪問一個網(wǎng)站時需...
    SylvanasSun閱讀 2,139評論 1 12
  • 本文中瀏覽器特指Chrome瀏覽器 開始之前說說幾個概念谤绳,以及在準備寫這篇文章之前對瀏覽器的渲染機制的了解: DO...
    若邪Y閱讀 3,509評論 1 10
  • 10:44 說起老郝占锯,我這么跟你說吧,我們之間既不能算是陌生人缩筛,因為最起碼我們認識消略;也不能算是熟人,我們對對方一點...
    風過無痕L閱讀 349評論 0 1
  • 不知你是不是這樣一類人瞎抛?父母給予了你他們所有艺演,但你卻感覺他們給你的東西太卑微,總是羨慕同齡人有更優(yōu)越的生活。他們...
    chen思哲閱讀 287評論 2 4