瀏覽器的加載url---DOM樹的解析(2019-1-23)

DOM樹的解析

2019-1-25 更新:
看到一篇寫的不錯的英文,語法很簡單,都可以看懂,講述了瀏覽器怎么加載網(wǎng)頁朴恳,有機會的話,先看完在做翻譯允蚣。
https://andydavies.me/blog/2013/10/22/how-the-browser-pre-loader-makes-pages-load-faster/

里面介紹了:How the pre-loader improves network utilisation

When the browser is blocked on a script, a second lightweight parser scans the rest of the markup looking for other resources e.g. stylesheets, scripts, images etc., that also need to be retrieved.
// 當(dāng)瀏覽器解析被script標簽阻塞的時候于颖,另一個輕量級的解析起掃描余下的文檔,尋找那么需要被取回的資源:css js img等等

當(dāng)拿到html的內(nèi)容之后嚷兔,有一套特定的語法規(guī)則來解析html森渐,解析文檔是指將文檔轉(zhuǎn)化成為可讓代碼理解和使用的結(jié)構(gòu)做入,包括詞法分析和語法分析

瀏覽器的解析器基本可以分為兩個階段:標記化和樹構(gòu)建

標記化是詞法分析過程

將輸入內(nèi)容解析成多個標記。HTML 標記包括起始標記同衣、結(jié)束標記母蛛、屬性名稱和屬性值。
標記生成器識別標記乳怎,傳遞給樹構(gòu)造器彩郊,然后接受下一個字符以識別下一個標記;如此反復(fù)直到輸入的結(jié)束

標記化算法的輸入結(jié)果是HTML標記蚪缀,使用狀態(tài)機表示秫逝。狀態(tài)機一共有4個狀態(tài):
- 數(shù)據(jù)狀態(tài)(Data)、
- 標記打開狀態(tài)(Tag open)询枚、
- 標記名稱狀態(tài)(Tag name)违帆、
- 關(guān)閉標記打開狀態(tài)(Close tag open state)。

標記化算法過程:
<html><body>Hello world</body></html>
- 初始狀態(tài)是數(shù)據(jù)狀態(tài)
- 遇到字符 < 時金蜀,狀態(tài)更改為“標記打開狀態(tài)”
- 接收一個 a-z 字符會創(chuàng)建“起始標記”刷后,狀態(tài)更改為“標記名稱狀態(tài)”
- 這個狀態(tài)會一直保持到接收 > 字符。在此期間接收的每個字符都會附加到新的標記名稱上渊抄,
- 遇到 > 標記時尝胆,會發(fā)送當(dāng)前的標記,狀態(tài)改回“數(shù)據(jù)狀態(tài)”护桦,本例子的標記名稱為 html
- <body> 標記也會進行同樣的處理
- 現(xiàn)在我們回到“數(shù)據(jù)狀態(tài)”含衔。接收到 Hello world 中的 H 字符時,將創(chuàng)建并發(fā)送字符標記
- 現(xiàn)在我們回到“標記打開狀態(tài)”二庵。接收下一個輸入字符 / 時贪染,會創(chuàng)建 end tag token 并改為“標記名稱狀態(tài)”
- 我們會再次保持這個狀態(tài),直到接收 >催享。然后將發(fā)送新的標記杭隙,并回到“數(shù)據(jù)狀態(tài)”

樹構(gòu)建整理來自這個博客 https://blog.csdn.net/Alan_1550587588/article/details/80297765

樹構(gòu)建又叫做語法分析


樹構(gòu)建算法:
- 在創(chuàng)建解析器的同時,也會創(chuàng)建 Document 對象
- 樹構(gòu)建器接收到標簽解析器發(fā)來的起始標簽名后因妙,會加入到棧中痰憎,此時還未向DOM樹中添加任何結(jié)點
- 當(dāng)接收到一個帶有</>結(jié)束標簽,此時查詢棧頂元素兰迫,
  如果和傳入的結(jié)束標簽屬于同種類型的標簽信殊,則將棧頂元素彈出,向DOM樹中加入此節(jié)    
  點汁果,然后繼續(xù)向下解析
- 如果遇到的是沒有封閉標簽的元素如<img/>涡拘,則直接加入DOM樹中即可,無需入棧据德。
- 依次向下解析鳄乏,當(dāng)棧為空跷车,即<html>根節(jié)點也加入到DOM樹中,DOM樹構(gòu)建完畢橱野。

注意??:
這里需要指出的是朽缴,當(dāng)某個元素缺失結(jié)束標簽時,棧頂元素是<div>水援,
但是此時傳來的結(jié)束標簽是</body>密强,兩者不是同一種標簽,說明div缺少了結(jié)束標簽蜗元,
這種情況也將棧頂<div>元素彈出或渤,加入到DOM樹中。
相當(dāng)于給<div>補了一個</div>結(jié)束標簽奕扣,這就是解析器的高容錯機制薪鹦。

所以解析的html的過程中

  • 遇到link標簽,會重新開一個下載線程去下載惯豆,html解析不會中斷池磁,
  • 遇到script標簽的時候會等待文件下載完成,立即執(zhí)行楷兽,執(zhí)行完畢后再向下解析地熄,
    會阻塞html的dom解析,才會有優(yōu)化html結(jié)構(gòu)的時候拄养,把css放在頭部离斩,把script放在尾部
  • 遇到img標簽的時候银舱,也和css一樣瀏覽器重新開一個下載線程去下載瘪匿,不會阻塞dom的解析

defer和async

https://segmentfault.com/a/1190000008299659

image.png

  • defer 是一個延遲執(zhí)行的標示 當(dāng)<script defer>的時候告訴瀏覽器,異步下載 不影響dom的parse,我猜背后的原理應(yīng)該和link標簽一樣寻馏,也是瀏覽器另開了一個線程去下載棋弥,下載完了之后不去立刻執(zhí)行,控制權(quán)沒有給到j(luò)s引擎線程诚欠,所以渲染線程才不受影響顽染,能繼續(xù)解析dom樹,dom樹加載完成在onload事件觸發(fā)之前執(zhí)行,

  • async是可以異步下載轰绵,但是下載完了之后立即執(zhí)行粉寞,下載還是另開一個線程需下載的,所以不影響dom parse 但是下載完了立刻去解析左腔,所以唧垦,控制權(quán)交給js引擎線程,所以解析被block了

最后編輯于
?著作權(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é)果婚禮上审洞,老公的妹妹穿的比我還像新娘莱睁。我一直安慰自己,他們只是感情好芒澜,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布仰剿。 她就那樣靜靜地躺著,像睡著了一般痴晦。 火紅的嫁衣襯著肌膚如雪南吮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天誊酌,我揣著相機與錄音部凑,去河邊找鬼。 笑死碧浊,一個胖子當(dāng)著我的面吹牛涂邀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箱锐,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼比勉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敷搪,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤兴想,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赡勘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫂便,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年闸与,在試婚紗的時候發(fā)現(xiàn)自己被綠了毙替。 大學(xué)時的朋友給我發(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
  • 正文 我出身青樓,卻偏偏與公主長得像摔握,于是被迫代替她去往敵國和親寄狼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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