成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS 會阻塞 DOM 解析嗎?

開發(fā) 前端
關(guān)鍵的點在于上述的 4 步并不是以嚴(yán)格順序執(zhí)行的。渲染引擎會以最快的速度展示內(nèi)容,也就是說,瀏覽器一邊解析 HTML,一邊構(gòu)建渲染樹,構(gòu)建一部分,就會把當(dāng)前已有的元素渲染出來。

[[409686]]

本文轉(zhuǎn)載自微信公眾號「三分鐘學(xué)前端」,作者sisterAn 。轉(zhuǎn)載本文請聯(lián)系三分鐘學(xué)前端公眾號。

瀏覽器的渲染

瀏覽器的渲染流程如下:

圖:WebKit 主流程

圖:Mozilla 的 Gecko 呈現(xiàn)引擎主流程(3.6)

結(jié)合上圖,一個完整的渲染流程如下:

  • 渲染進(jìn)程解析 HTML 內(nèi)容轉(zhuǎn)換為能夠讀懂的 DOM 樹結(jié)構(gòu),解析 CSS 為 CSSDOM
  • 把 DOM 和 CSSOM 結(jié)合起來生成渲染樹(Render Tree)
  • 渲染樹構(gòu)建好了之后,將會執(zhí)行布局過程,它將確定每個節(jié)點在屏幕上的確切坐標(biāo)
  • 把渲染樹展示到屏幕上。再下一步就是繪制,即遍歷渲染樹,并使用UI后端層繪制每個節(jié)點。

值得注意的是:

關(guān)鍵的點在于上述的 4 步并不是以嚴(yán)格順序執(zhí)行的。渲染引擎會以最快的速度展示內(nèi)容,也就是說,瀏覽器一邊解析 HTML,一邊構(gòu)建渲染樹,構(gòu)建一部分,就會把當(dāng)前已有的元素渲染出來。如果這個時候外部樣式并沒有加載完成,渲染出來的就是瀏覽器默認(rèn)樣式了。

其它階段也是如此。由于瀏覽器會嘗試盡快展示內(nèi)容,所以內(nèi)容有時會在樣式還沒有加載的時候展示出來。這就是經(jīng)常發(fā)生的FOCU(flash of unstyled content)或白屏問題。

CSS 加載不會阻塞 DOM 樹的解析

由瀏覽器的渲染流程圖可知,DOM 解析和 CSS 解析是兩個并行的進(jìn)程,所以 CSS 加載不會阻塞 DOM 樹的解析

CSS 加載會阻塞 DOM 樹的渲染

Render Tree是依賴于 DOM Tree 和 CSSOM Tree 的,所以無論 DOM Tree 是否已經(jīng)完成,它都必須等待到 CSSOM Tree 構(gòu)建完成,即 CSS 加載完成(或 CSS 加載失敗)后,才能開始渲染。

因此,CSS加載是會阻塞 DOM 樹的渲染

  1. <head> 
  2.     <script> 
  3.         document.addEventListener('DOMContentLoaded', () => { 
  4.             var p = document.querySelector('p'
  5.             console.log(p) 
  6.         }) 
  7.     </script> 
  8.     <link rel="stylesheet" href="./static/style.css?sleep=3000"
  9. </head> 
  10.  
  11. <body> 
  12.     <p>hello world</p> 
  13. </body> 

案例來源:關(guān)于 JS 與 CSS 是否阻塞 DOM 的渲染和解析

CSS 的加載并沒有阻塞 DOM 樹的解析,p 標(biāo)簽是正常解析的,但 p 標(biāo)簽加載完后,頁面是遲遲沒有渲染的,是因為 CSS 還沒有請求完成,在 CSS 請求完成后,hello world 才被渲染出來,所以 CSS 會阻塞頁面渲染

DOMContentLoaded:只有當(dāng)純 HTML 被完全加載以及解析時,DOMContentLoaded 事件會被觸發(fā),它不會等待樣式表,圖片或者子框架完成加載

CSS 加載會阻塞其后的 JS 執(zhí)行

由瀏覽器的渲染流程圖可知,JS 的加載、解析與執(zhí)行會阻塞 DOM 的構(gòu)建,也就是說,在構(gòu)建 DOM 時,HTML 解析器若遇到了 JS,那么它會暫停構(gòu)建 DOM ,將控制權(quán)移交給JS引擎,等 JS 引擎運行完畢,瀏覽器再從中斷的地方恢復(fù) DOM 構(gòu)建。

這也是建議將 script 標(biāo)簽放在 body 標(biāo)簽底部的原因。

由瀏覽器的渲染流程圖可知,DOM 和 CSSOM 的構(gòu)建是互不影響,但如果在 JS 腳本前引入外部 CSS 文件?

  1. <html> 
  2.     <head>     
  3.         <link href="theme.css" rel="stylesheet"
  4.     </head> 
  5.     <body>     
  6.         <div>hello world</div>     
  7.         <script>         
  8.             console.log('hello world')     
  9.         </script>     
  10.         <div>hello world</div> 
  11.     </body> 
  12. </html> 

它的執(zhí)行流程:

此時 CSS 也阻塞 DOM 的生成

這是因為 JS 不只是可以改 DOM ,它還可以更改樣式,也就是它可以更改 CSSOM 。而不完整的 CSSOM 是無法使用的, JS 中想訪問 CSSOM 并更改它,那么在執(zhí)行 JS 時,必須要能拿到完整的CSSOM。

所以就導(dǎo)致了一個現(xiàn)象,如果瀏覽器尚未完成 CSSOM 的下載和構(gòu)建,而我們卻想在此時運行腳本,那么瀏覽器將延遲腳本執(zhí)行和 DOM 構(gòu)建,直至其完成 CSSOM 的下載和構(gòu)建。也就是說,在這種情況下,瀏覽器會先下載和構(gòu)建 CSSOM ,然后再執(zhí)行JS腳本,最后在繼續(xù)構(gòu)建 DOM 。

如果也有 JS 加載喃?

  1. <head> 
  2.     <script> 
  3.         document.addEventListener('DOMContentLoaded', () => { 
  4.             var p = document.querySelector('p'
  5.             console.log(p) 
  6.         }) 
  7.     </script> 
  8.     <link rel="stylesheet" href="./static/style.css?sleep=3000"
  9.     <script src="./static/index.js"></script> 
  10. </head> 
  11.  
  12. <body> 
  13.     <p>hello world</p> 
  14. </body> 

HTML 文件中包含了 CSS 的外部引用和 JS 外部文件,HTML 同時發(fā)起這兩個文件的下載請求,不管 CSS 文件和 JS 文件誰先到達(dá),都要先等到 CSS 文件下載完成并生成 CSSOM,然后再執(zhí)行 JavaScript 腳本,最后再繼續(xù)構(gòu)建 DOM,構(gòu)建布局樹,繪制頁面。

所以一般將 <script> 放在 <link> 標(biāo)簽前面

如何優(yōu)化渲染流程即如何減少白屏?xí)r間?

  • 使用內(nèi)聯(lián) JS、CSS ,減少 JS 、 CSS 文件的下載
  • webpack 等工具對 JS、CSS 文件壓縮,減少文件大小
  • 使用 async 或者 defer
  • 使用 CDN 等
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/510

 

責(zé)任編輯:武曉燕 來源: 三分鐘學(xué)前端
相關(guān)推薦

2009-06-10 14:43:27

SAP顧問飽和

2018-08-23 09:10:01

數(shù)據(jù)庫MySQLInnoDB

2018-08-27 07:29:34

InnoDBinsertselect

2010-09-28 10:03:15

DOM文檔對象模型

2010-09-09 13:55:47

XML DOM

2010-09-28 13:40:52

DOM元素

2010-09-15 14:40:07

HTMLposition屬性

2020-09-28 14:26:42

Shadow DOMWeb組件

2010-09-15 17:18:28

HTML DOM di

2022-01-11 20:42:28

CSS Chrome瀏覽器

2023-11-01 08:36:07

CSSTailwind

2024-01-15 09:23:16

框架方式原生

2022-12-08 08:16:59

ChatGPT開源商業(yè)化

2023-03-27 08:17:48

2010-09-28 10:33:59

HTML DOM Ch

2009-11-02 11:02:58

VB.NET XML文

2019-05-07 15:49:27

AI人工智能藝術(shù)

2010-08-30 15:26:13

floatCSS

2010-09-16 10:04:50

CSSdisplay:tab

2010-08-20 14:58:26

CSSpadding
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人av网站在线观看 | 91传媒在线观看 | 精品视频一区二区 | 久久综合一区二区三区 | 久久99精品久久久久久 | 亚洲国产精品va在线看黑人 | 一区二区三区四区在线 | 欧美精品一区二区三区在线播放 | 欧洲免费毛片 | 逼逼视频 | 欧美天堂 | 精品国产一级片 | 精精国产xxxx视频在线 | 中文字幕1区| 99久久免费精品国产男女高不卡 | 成人在线观看网址 | 国产亚洲精品久久情网 | 国产精品网页 | 天堂中文资源在线 | 在线观看的av | 日韩a | 免费看一级毛片 | 日韩免费一二三区 | 欧美日韩综合视频 | 日日爱av| 日本一区二区三区免费观看 | 国户精品久久久久久久久久久不卡 | 综合久久久久久久 | 亚洲精品电影在线观看 | www国产成人免费观看视频,深夜成人网 | 女女爱爱视频 | 国产精品不卡一区 | 狠狠亚洲| 欧美三级视频在线观看 | 亚洲欧美日韩在线不卡 | 亚洲免费视频网址 | 国产精品亚洲一区 | 亚洲精品一区二区三区蜜桃久 | 粉嫩粉嫩芽的虎白女18在线视频 | 中文二区| 日韩二区 |