瀏覽器工作原理

一次完整的請(qǐng)求過程:

一次完整的請(qǐng)求過程

本文主要探討render部分躏升,前端是如何渲染模板給用戶顯示的辩棒。

五種主流瀏覽器——IE、Firefox膨疏、Safari一睁、Chrome及Opera

份額
各大瀏覽器解析

瀏覽器功能

瀏覽器的主要功能是將用戶選擇得web資源呈現(xiàn)出來(lái),它需要從服務(wù)器請(qǐng)求資源佃却,并將其顯示在瀏覽器窗口中者吁,資源的格式通常是HTML,也包括PDF饲帅、image及其他格式复凳。

瀏覽器的主要構(gòu)成High Level Structure(高層結(jié)構(gòu))

  1. 用戶界面- 包括地址欄、后退/前進(jìn)按鈕灶泵、書簽?zāi)夸浀扔耍簿褪悄闼吹降某擞脕?lái)顯示你所請(qǐng)求頁(yè)面的主窗口之外的其他部分
  2. 瀏覽器引擎- 用來(lái)查詢及操作渲染引擎的接口
  3. 渲染引擎- 用來(lái)顯示請(qǐng)求的內(nèi)容,例如赦邻,如果請(qǐng)求內(nèi)容為html髓棋,它負(fù)責(zé)解析html及css,并將解析后的結(jié)果顯示出來(lái)
  4. 網(wǎng)絡(luò)- 用來(lái)完成網(wǎng)絡(luò)調(diào)用惶洲,例如http請(qǐng)求按声,它具有平臺(tái)無(wú)關(guān)的接口,可以在不同平臺(tái)上工作
  5. UI 后端- 用來(lái)繪制類似組合選擇框及對(duì)話框等基本組件恬吕,具有不特定于某個(gè)平臺(tái)的通用接口签则,底層使用操作系統(tǒng)的用戶接口
  6. JS解釋器- 用來(lái)解釋執(zhí)行JS代碼
  7. 數(shù)據(jù)存儲(chǔ)- 屬于持久層,瀏覽器需要在硬盤中保存類似cookie的各種數(shù)據(jù)币呵,HTML5定義了web database技術(shù)怀愧,這是一種輕量級(jí)完整的客戶端存儲(chǔ)技術(shù)
瀏覽器基本組件
  • Chrome為每個(gè)標(biāo)簽分配了各自的渲染引擎實(shí)例,是單獨(dú)的進(jìn)程
  • 渲染引擎:Firefox余赢、Chrome和Safari是基于兩種渲染引擎構(gòu)建的,F(xiàn)irefox使用Geoko——Mozilla自主研發(fā)的渲染引擎哈垢,Safari和Chrome都使用webkit妻柒。Webkit是一款開源渲染引擎,它本來(lái)是為linux平臺(tái)研發(fā)的耘分,后來(lái)由Apple移植到Mac及Windows上举塔。

渲染過程

  1. 當(dāng)用戶輸入url绑警,webkit調(diào)用資源加載器加載url對(duì)應(yīng)的網(wǎng)頁(yè)
  2. 加載器依賴網(wǎng)絡(luò)模塊建立連接,發(fā)送請(qǐng)求并接受答復(fù)
  3. webit接收到各種網(wǎng)頁(yè)或者資源的數(shù)據(jù)央渣,其中某些資源可能是同步或者異步的
  4. 網(wǎng)頁(yè)被交給html解析器轉(zhuǎn)變一系列的詞語(yǔ)(Token)
  5. 解析器根據(jù)詞語(yǔ)構(gòu)建節(jié)點(diǎn)计盒,形成DOM書
  6. 如果節(jié)點(diǎn)依賴其他資源,例如css img 芽丹,則調(diào)用資源加載器來(lái)加載他們北启,這些都是異步的,不會(huì)阻礙dom樹的構(gòu)建


    在瀏覽器中分析

css阻塞

  1. 內(nèi)部css是html解析器調(diào)用解析css的api解析的拔第,這是同步的不會(huì)阻塞渲染過程
  2. 外部css樣式會(huì)調(diào)用css樣式表解析器咕村,這會(huì)是異步的,會(huì)阻塞渲染過程(不會(huì)有閃屏問題:用戶只看到dom結(jié)構(gòu)而看不到樣式)


    css樣式表解析器解析外部css樣式表蚊俺,阻礙了渲染過程

js阻塞

  1. 內(nèi)部js和外部js都會(huì)阻塞頁(yè)面的渲染
  2. 主流瀏覽器會(huì)有預(yù)解析處理懈涛,在執(zhí)行js腳本時(shí),其他線程會(huì)解析文檔的其余部分泳猬,并找出加載需要通過網(wǎng)絡(luò)加載的其他資源批钠。

圖層

圖層不會(huì)影響到根節(jié)點(diǎn)

創(chuàng)建圖層的條件

  1. 3D css屬性
  2. video節(jié)點(diǎn)
  3. canvas節(jié)點(diǎn)
  4. css3動(dòng)畫節(jié)點(diǎn)
  5. css加速屬性的元素(盡量給每個(gè)動(dòng)畫都加:will-change:transform,瀏覽器會(huì)幫你開圖層)
  6. 有一個(gè)z-index較低且包含一個(gè)復(fù)合層的兄弟元素
打開瀏覽器圖層

重繪(repaint)

  • 重繪是一個(gè)元素外觀的改變所觸發(fā)的瀏覽器行為得封,例如改變outline价匠,背景色等屬性。瀏覽器會(huì)根據(jù)元素的新屬性重新繪制使元素呈現(xiàn)出新的外觀呛每。重繪不會(huì)帶來(lái)重排
  • 需要注意的是踩窖,如果圖層中某個(gè)元素需要重繪,那么整個(gè)圖層都需要重繪
  • 優(yōu)化:重繪元素(css動(dòng)畫晨横,gif圖)需要開一個(gè)圖層(translateZ(0))洋腮,不影響到其他元素

重排(reflow 回流)

  • 渲染對(duì)象在創(chuàng)建完成并添加到渲染樹時(shí),并不包含位置和大小信息手形。計(jì)算這些值的過程稱之為布局和重排啥供。重排必定導(dǎo)致重繪
勾選此屬性,當(dāng)瀏覽發(fā)生重繪頁(yè)面變綠

由重繪库糠,重排想到的前端頁(yè)面渲染優(yōu)化方案:

  1. 元素的top伙狐,left操作盡量用css3的translate操作
  2. 使用opacity來(lái)替代visibility
  3. 不要使用table布局
  4. 將多次改變樣式屬性的操作合并成一次操作,放到一個(gè)class進(jìn)行操作
  5. 復(fù)雜的操作瞬欧,先將dom離線后(dioplay:none)再進(jìn)行操作
  6. 利用文檔碎片
    7.動(dòng)畫實(shí)現(xiàn)贷屎,啟動(dòng)gpu加速
    8.為動(dòng)畫元素新建圖層,提高動(dòng)畫元素的z-index

主流程 The main flow

  1. 第一步艘虎,瀏覽器拿到html文件唉侄,先用標(biāo)簽轉(zhuǎn)化為內(nèi)容樹中的dom節(jié)點(diǎn),生成dom樹野建,顯示基本結(jié)構(gòu)
  2. 第二步属划,解析外部CSS文件及style標(biāo)簽中的樣式信息恬叹。生成另一棵樹——render樹,render樹由一些包含有顏色和大小等屬性的矩形組成同眯,它們將被按照正確的順序顯示到屏幕上(有時(shí)候剛打開網(wǎng)頁(yè)時(shí)會(huì)看到?jīng)]有樣式的結(jié)構(gòu))注意:第2步可能和第1步同時(shí)進(jìn)行
  3. 第三步绽昼,渲染引擎給每個(gè)矩形找坐標(biāo),布局须蜗,繪制

解析 Parsing-general

解析是渲染引擎中一個(gè)非常重要的過程硅确。解析一個(gè)文檔即將其轉(zhuǎn)換為具有一定意義的結(jié)構(gòu)——編碼可以理解和使用的東西。解析的結(jié)果通常是表達(dá)文檔結(jié)構(gòu)的節(jié)點(diǎn)樹唠粥,稱為解析樹或語(yǔ)法樹疏魏。在解析之前會(huì)將文檔先轉(zhuǎn)換 Translation為解析書,再解析晤愧。解析是由解析器來(lái)做的大莫,解析又分為語(yǔ)法解析和此法解析。解析是根據(jù)文法 Grammars規(guī)則來(lái)進(jìn)行的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末官份,一起剝皮案震驚了整個(gè)濱河市只厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舅巷,老刑警劉巖羔味,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钠右,居然都是意外死亡赋元,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門飒房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搁凸,“玉大人,你說我怎么就攤上這事狠毯』ぬ牵” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嚼松,是天一觀的道長(zhǎng)嫡良。 經(jīng)常有香客問我,道長(zhǎng)献酗,這世上最難降的妖魔是什么寝受? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凌摄,結(jié)果婚禮上羡蛾,老公的妹妹穿的比我還像新娘。我一直安慰自己锨亏,他們只是感情好痴怨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著器予,像睡著了一般浪藻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乾翔,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天爱葵,我揣著相機(jī)與錄音,去河邊找鬼反浓。 笑死萌丈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雷则。 我是一名探鬼主播辆雾,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼月劈!你這毒婦竟也來(lái)了度迂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猜揪,失蹤者是張志新(化名)和其女友劉穎惭墓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體而姐,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腊凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拴念。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钧萍。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丈莺,靈堂內(nèi)的尸體忽然破棺而出划煮,到底是詐尸還是另有隱情,我是刑警寧澤缔俄,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布弛秋,位于F島的核電站,受9級(jí)特大地震影響俐载,放射性物質(zhì)發(fā)生泄漏蟹略。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一遏佣、第九天 我趴在偏房一處隱蔽的房頂上張望挖炬。 院中可真熱鬧,春花似錦状婶、人聲如沸意敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)草姻。三九已至钓猬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撩独,已是汗流浹背敞曹。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留综膀,地道東北人澳迫。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剧劝,于是被迫代替她去往敵國(guó)和親橄登。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344