14. JS相關概念

CSS和JS在網頁中的放置順序

  • 網站加載的整個完整過程:
    1. 首先瀏覽器從服務器接收到html代碼,然后開始解析html
    2. 構建DOM樹(自html頂向下進行構建),并且在同時構建渲染樹
    3. 遇到JS文件加載執行,將阻塞DOM樹的構建;遇到CSS文件,將阻塞渲染樹的構建
      (script標簽中的defer屬性:構建DOM樹的過程和js文件的加載異步(并行)進行,但是js文件執行需要在DOM樹構建完成之后。
      script標簽中的async屬性:構建DOM樹、渲染樹的過程和js文件的加載和執行異步(并行)進行)
  • 為何要注意CSS和JS在網頁中的放置順序
    1. 若CSS樣式放在底部,對于IE瀏覽器,在點擊鏈接、輸入URL、使用書簽進入等情況下,會逐步加載無樣式的內容,等CSS加載后頁面突然會展現樣式,影響閱讀。
    2. 若JS放在頂部(<head>標簽等),會禁用并發,阻止其他內容的下載,影響頁面加載的速度;如果js文件比較大,算法也比較復雜的話,影響更大。

白屏和FOUC

  • 在寫HTML代碼時,我們都是將CSS文件的引入位置放在頭部(<head>標簽內部),將js文件的引入位置放在底部(</body>前面)。
  • 不同的瀏覽器對于CSS和HTML的處理方式不同,有的是等待CSS加載完成之后,對HTML元素進行渲染和展示(白屏問題)。有的是先對HTML元素進行展示,然后等待CSS加載完成之后重新對樣式進行修改(FOUC無樣式內容閃爍)
  • 如果把CSS樣式放在底部,對于IE瀏覽器,在某些場景下(新窗口打開,刷新等)頁面會出現白屏,而不是內容逐步展現,如果使用 @import標簽,即使 CSS 放入 link, 并且放在頭部,也可能出現白屏。
  • 如果把CSS樣式放在底部,對于IE瀏覽器,在某些場景下(點擊鏈接,輸入URL,使用書簽進入等),會出現 FOUC 現象(逐步加載無樣式的內容,等CSS加載后頁面突然展現樣式).對于 Firefox 會一直表現出 FOUC 。
  • 如果把js文件放在頭部,腳本會阻塞后面內容的呈現,腳本會阻塞其后組件的下載,出現白屏問題。

async與defer的作用和區別

  • 作用
    <script src="script.js"></script>
    沒有defer或async,瀏覽器會立即加載并執行指定的腳本(“立即”指的是在渲染該script標簽之下的文檔之前),也就是說不等后續載入的文檔元素,讀到就加載并執行。
    <script async src="script.js"></script>
    有async,加載和渲染后續文檔元素的過程將和script.js的加載與執行并行進行(異步)。
    <script defer src="script.js"></script>
    有defer,加載后續文檔元素的過程和script.js的加載并行進行(異步),但script.js的執行要在所有元素解析完成之后,DOMContentLoaded事件觸發之前完成。

  • 區別

284aec5bb7f16b3ef4e7482110c5ddbb_articlex.jpg

藍色線代表網絡讀取,紅色線代表執行時間,這倆都是針對腳本的;綠色線代表 HTML 解析。
defer 和 async 在網絡讀取(下載)這塊兒是一樣的,都是異步的(相較于 HTML 解析),它倆的差別在于腳本下載完之后何時執行。
defer:腳本延遲到文檔解析和顯示后執行,有順序
async:不保證順序。

網頁的渲染機制

  1. 構建DOM樹(DOM tree):從上到下解析HTML文檔生成DOM節點樹(DOM tree),也叫內容樹(content tree);
  2. 構建CSSOM(CSS Object Model)樹:加載解析樣式生成CSSOM樹;
  3. 執行JavaScript:加載并執行JavaScript代碼(包括內聯代碼或外聯JavaScript文件);
  4. 構建渲染樹(render tree):根據DOM樹和CSSOM樹,生成渲染樹(render tree);
    渲染樹:按順序展示在屏幕上的一系列矩形,這些矩形帶有字體,顏色和尺寸等視覺屬性。
  5. 布局(layout):根據渲染樹將節點樹的每一個節點布局在屏幕上的正確位置;
  6. 繪制(painting):遍歷渲染樹繪制所有節點,為每一個節點適用對應的樣式,這一過程是通過UI后端模塊完成;
流程.png

為了更友好的用戶體驗,瀏覽器會盡可能快的展現內容,而不會等到文檔所有內容到達才開始解析和構建/布局渲染樹,而是每次處理一部分,并展現在屏幕上,這也是為什么我們經常可以看到頁面加載的時候內容是從上到下一點一點展現的。

Webkit渲染引擎流程如下圖:

Webkit渲染引擎流程.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容