瀏覽器的關鍵路徑渲染

一、網(wǎng)頁的渲染機制

1. CSSOM 和 DOM

先拋開 JS 不說,瀏覽器收到一張html頁面時,會從上往下開始生成 DOM(Document Object Model) 樹,如果中途發(fā)現(xiàn)有樣式如<link>引入或者<style>寫法,瀏覽器就會同步生成 CSSOM(CSS Object Model)。當 DOM 和 CSSOM 樹構建好之后,瀏覽器就會開始組合,生成渲染樹(Render-Tree),最后就是渲染(繪制),也就是展示給我們看的內容。這里需要注意兩個詞:構建渲染。這是兩個階段。

瀏覽器的渲染機制

參考:渲染樹構建、布局及繪制 | Web | Google-Developers

2. 阻塞渲染的 CSS

在上文我們提及到,渲染樹是在 CSSOM 和 DOM 構建好之后開始的,也就是說,CSS 和 HTML 是阻塞瀏覽器渲染的,因為如果不完整讀取 CSS 和 HTML ,就無法構建 CSSOM 和 DOM ,也就無法渲染。通常第一個請求就已經(jīng)下載好完整的 HTML 了,也就是說,構建 DOM 是比 CSSOM 快的,因為在解析 HTML 時,才會知道并請求 CSS(CSS 通過 <link><style>引入),所以 CSS 會阻塞渲染樹的構建。這也是為什么通常把 CSS 文件的引入放在<head>,早引入,早生成 CSSOM??梢酝ㄟ^媒體查詢來跳過某些 CSS,不納入 CSSOM 的生成過程,加快 CSSOM 構建。

參考:阻塞渲染的 CSS | Web | Google-developers

3. JS 引入

我們知道 JS 是可以修改 DOM 節(jié)點和 DOM 樣式的,所以 JS 既阻塞 DOM、CSSOM 的構建,也阻塞渲染樹的生成。在解析 HTML 中發(fā)現(xiàn)引入了 JS 后,會下載完 JS 并執(zhí)行之后,才會繼續(xù)解析、構建 HTML。因此我們常常把<script>放到</body>前面,加快網(wǎng)頁生成速度。

參考:使用 JavaScript 添加交互 | Web | Google-developers

4. 完整的瀏覽器渲染過程

實際中,瀏覽器有自己的策略去優(yōu)化頁面的渲染速度,雖然默認情況下。 CSSOM 和 DOM 應該先構建再渲染,但假如網(wǎng)速太慢,瀏覽器有可能先渲染部分內容。至于更復雜的優(yōu)化,這里就不討論了。以下是完整的渲染過程:

完整的瀏覽器渲染過程

二、CSS 和 JS 在網(wǎng)頁中的放置順序是怎樣的?

從上文我們知道,為了加快瀏覽器渲染,我們應該盡早獲取 CSS 和構建 DOM,因此 CSS 通常放在 HTML 的<head>里面,而 JS 放到</body>之前。

三、解釋白屏和 FOUC

1. 白屏

瀏覽器的渲染需要先生成 DOM 和 CSSOM 樹,假如 CSS 獲取時間過長(比如 CSS 在最后引入),就會導致 CSSOM 生成過久,瀏覽器只能等待,這時候就會出現(xiàn)長時間白屏,直到 DOM 和 CSSOM 構建完成。通常打開頁面都會短暫白屏,因為 DOM 和 CSSOM 構建需要時間。

2. FOUC (flash of unstyled content)

有些瀏覽器(如:FireFox)會先渲染 DOM ,等到 CSSOM 生成了,再重繪渲染,這樣就會看到一部分沒樣式的內容,然后再看到有樣式的。這種分塊分步的渲染。

四、async 和 defer 的作用是什么?有什么區(qū)別

JS 在 HTML 中引入有三種<script> <script async> <script defer>。

1. 直接引入<script>

會阻塞瀏覽器渲染,必須等到 JS 下載并執(zhí)行才繼續(xù)解析 HTML

2. async 方式引入

JS 的下載和 HTML 的解析并行進行,但只要 JS 下載完成,就馬上開始執(zhí)行,同時阻塞 HTML 解析。

3. defer 方式引入

JS 的下載和 HTML 的解析并行進行,但直到 HTML 解析結束,才執(zhí)行 JS。

如圖:

js 引入的三種方式

參考:async 和 defer 的區(qū)別 | SegmentFault

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 大家都知道萬維網(wǎng)的應用層使用了HTTP協(xié)議,并且用瀏覽器作為入口訪問網(wǎng)絡上的資源。用戶在使用瀏覽器訪問一個網(wǎng)站時需...
    SylvanasSun閱讀 2,233評論 1 12
  • 寫在前面 關于前端性能優(yōu)化的文章非常多,寫瀏覽器關鍵渲染路徑的也不少,但總是感覺哪里錯了或者哪里疏忽了,于是自己寫...
    卿可津閱讀 1,275評論 0 1
  • 瀏覽器指的是Chrome系瀏覽器【Firefox大同小異,IE未知】以下提到的“節(jié)點”、“標簽”和“元素”不做區(qū)分...
    Yieiy閱讀 4,205評論 4 26
  • 本文中瀏覽器特指Chrome瀏覽器 開始之前說說幾個概念,以及在準備寫這篇文章之前對瀏覽器的渲染機制的了解: DO...
    若邪Y閱讀 3,634評論 1 10
  • 很多單位和前下屬之間的關系總是怪怪的,單位覺得好不容易培養(yǎng)一個人卻走了,辜負了多年來的栽培。于是在下屬離開的時候,...
    東木與木東閱讀 1,428評論 2 12

友情鏈接更多精彩內容