CSS加載會造成堵塞嗎?
共 5442字,需瀏覽 11分鐘
·
2024-05-10 09:15
點擊上方 前端Q,關(guān)注公眾號
回復(fù)加群,加入前端Q技術(shù)交流群
首先配置瀏覽器網(wǎng)絡(luò)速度,使現(xiàn)象更明顯。
-
打開chrome控制臺(按下F12),選擇No Throttling,并在Custom中選擇Add
-
對瀏覽器上傳與下載速度進(jìn)行限制
2. CSS加載不會堵塞DOM的解析,但會堵塞DOM的渲染
<!DOCTYPE html>
<html lang="en">
<head>
<title>css阻塞</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
h1 {
color: red !important;
}
</style>
<script>
function h() {
console.log(document.querySelectorAll("h1"));
}
setTimeout(h, 0);
</script>
<link
href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css"
rel="stylesheet"
/>
</head>
<body>
<h1>這是紅色的</h1>
</body>
</html>
效果:在CSS加載時,JS就能獲取到DOM節(jié)點,說明CSS加載不會堵塞DOM的解析
使用Performance進(jìn)行分析:可以看到在css加載完成后,DOM渲染才完成,說明CSS加載會堵塞DOM渲染(CSS加載完成前,頁面白屏)
-
Load:在所有依賴資源加載完觸發(fā) -
LCP(largest contentful Paint):頁面最大內(nèi)容渲染時間 -
FP(First Paint):第一個像素渲染到屏幕上的時間 -
FCP(First Contentful Paint):渲染出第一個內(nèi)容。內(nèi)容可以是文本、圖片
3. 原理分析
從圖中可知,Chrome瀏覽器渲染流程如下:
1.解析HTML,生成DOM樹
2.解析CSS,生成CSS規(guī)則樹
3.合并DOM樹和CSS規(guī)則樹,生成渲染樹
4.布局
5.繪制
從流程可以看出來,DOM解析和CSS解析是兩個并行的過程,因此CSS加載不會堵塞DOM的解析。但渲染樹依賴CSS規(guī)則樹,因此CSS加載會堵塞DOM的渲染。
4. CSS加載會堵塞JS運行
<!DOCTYPE html>
<html lang="en">
<head>
<title>css阻塞</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script>
console.log("before css");
var startDate = new Date();
</script>
<link
href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css"
rel="stylesheet"
/>
</head>
<body>
<h1>這是紅色的</h1>
<script>
var endDate = new Date();
console.log("after css");
console.log("經(jīng)過了" + (endDate - startDate) + "ms");
</script>
</body>
</html>
運行結(jié)果:
說明css會堵塞后面js執(zhí)行
5. 原理分析
瀏覽器的渲染進(jìn)程是多線程的,主要分為:GUI渲染線程、JS引擎線程、事件觸發(fā)線程、定時器觸發(fā)器線程、異步http請求線程
由于JS可能會操作之前的DOM節(jié)點和CSS樣式,為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置 GUI 渲染線程與 JavaScript 引擎為互斥的關(guān)系,因此css會堵塞后面js的執(zhí)行
6. 結(jié)論
1. CSS加載不會堵塞DOM的解析,但會堵塞DOM的渲染
2. CSS加載會堵塞后面JS的執(zhí)行
往期推薦
最后
歡迎加我微信,拉你進(jìn)技術(shù)群,長期交流學(xué)習(xí)...
歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個專業(yè)的技術(shù)人...
