iT邦幫忙

DAY 17
1

30 天學會 Web 前端效能優化系列 第 17

[30 天學會 Web 前端效能優化] 17. CSS 會阻擋頁面的 Rendering

  • 分享至 

  • xImage
  •  

前面我們已經學習 Browser 是如何運作的了,從這一篇開始,我們會繼續針對一些前面沒講到的特性繼續作說明。

假設今天瀏覽器取得以下頁面 :

  <link href="layout.css" rel="stylesheet" type="text/css" />


  <p>Hello this is a test page.</p>

瀏覽器取得此 HTML Document 後便開始進行 parsing ,當它遇到 CSS 那一段時,就會立刻 dispatch 一個 request 去取得 CSS file,接著 HTML Parser 又會繼續執行它的工作。

假設取得這一份 CSS ,從 server 到 client 需要花費 200ms ,但是因為這份 HTML 行數很少的關係,在瀏覽器 dispatch 一個 request 取得 CSS file 後,瀏覽器只花了 10ms 就完成解析 HTML 的動作,即使如此,我們仍必須花費 190ms 等待 CSS file 的抵達,外加 10ms 解析、建構 CSSOM 的時間才能完成整個頁面的 Rendering。為什麼這麼說?

如果各位還記得前面提到的內容的話,就會知道瀏覽器完成一個頁面的 rendering 需要經過:建構 DOM -> 建構 CSSOM -> 建構 Render Tree -> Layout -> Paint 等階段,而 Render Tree 是 DOM 和 CSSOM 的結合,因此今天就算 DOM 建構完成了,如果 CSSOM 還沒完成的話,還是無法進入 Rendering 的階段,也就是說使用者是無法看到任何內容的。這就是為什麼許多 Web 前端優化的 Best Practice 會提到將 CSS 放在 HTML Document 越上面越好,因為越快取得 CSS ,意味著可以越快完成 Rendering。

不過如果 CSS 很小的話,直接使用 inline CSS 是更好的,為什麼呢?假設 CSS 只有以下幾行:

body {
  width: 80%;
  margin: 0 auto;
}
p {
  font-size: 15px;
}

那麼如果 server 傳送資料到 clinet 需要花費 200ms ,而瀏覽器解析這份 CSS 只需花費 2ms ,不就白白浪費了 198ms 嗎?改成 inline CSS ,瞬間就榨出了這麼多時間。

(然而CSS 很大的話,使用 external CSS 會比較好,因為瀏覽器會 cache,如果是使用 inline CSS 的話,瀏覽器並不會 cache。)


上一篇
[30 天學會 Web 前端效能優化] 16. Composite
下一篇
[30 天學會 Web 前端效能優化] 18. Javascript 會阻擋 DOM Construction 的進行
系列文
30 天學會 Web 前端效能優化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言