瀏覽器的渲染過程

一、瀏覽器結(jié)構(gòu)

  • 用戶界面(User Interface):包括交互組件,地址欄,返回前進按鈕
  • 瀏覽器引擎(Browser engine):控制和管理下一級的渲染引擎
  • 渲染引擎(Rendering engine):解析請求內(nèi)容,HTML,XML,CSS
  • 網(wǎng)絡(Networking):處理HTTP請求等
  • UI后端(UI backend):繪制提示框等瀏覽器組件
  • JavaScript解析器(JavaScript Interpreter):解析和執(zhí)行JavaScript代碼
  • 數(shù)據(jù)存儲(Data Storage)持久化存儲,cookie,緩存

二、網(wǎng)絡請求過程

  1. 用戶在地址欄輸入域名,DNS(Domain Name System)域名解析服務器根據(jù)域名查找IP地址,向其發(fā)起請求
  2. 返回200響應碼,說明響應成功
  3. 瀏覽器得到并解析服務器返回的內(nèi)容response
  4. 加載HTML文件,及所需js,css,image等資源

三、渲染過程(關鍵渲染路徑Critical Rendering Path)

  1. 構(gòu)建DOM樹,從上到下解析HTML文檔生成DOM節(jié)點樹,也叫內(nèi)容樹
  2. 構(gòu)建CSSOM樹,加載解析樣式生成CSSOM樹
  3. 執(zhí)行JavaScript,加載并執(zhí)行JavaScript代碼
  4. 構(gòu)建渲染樹Render Tree,根據(jù)DOM樹和CSSOM樹生成。按順序展示在屏幕的一系列矩陣,帶有字體,顏色,尺寸等屬性
  5. 布局Layout,根據(jù)渲染樹將節(jié)點樹的每一個節(jié)點布局在屏幕上的正確位置
  6. 繪制painting,遍歷渲染樹繪制所有節(jié)點,為每一個節(jié)點對應樣式


    rendering path

    瀏覽器會每處理一部分內(nèi)容,并展現(xiàn)在屏幕上,所以頁面加載時是自上而下展現(xiàn)的

通常javascript會改變文檔DOM結(jié)構(gòu),瀏覽器以同步方式解析,加載和執(zhí)行腳本,遇到<script>標簽時,會解析并立即執(zhí)行直到完成,阻塞文檔的解析。所以一般建議將<script>放在<body>前,而不是<head>標簽內(nèi)

而瀏覽器對樣式的解析不會阻塞文檔解析

布局Layout(或叫回流Reflow),通過渲染樹中渲染對象的信息,計算出每一個渲染對象的位置和尺寸,將其安置在瀏覽器窗口的正確位置。有時會在文檔布局完成后對DOM進行修改,就需要重新布局,稱為回流,本質(zhì)上還是布局的過程

四、頁面渲染優(yōu)化

  1. HTML文檔結(jié)構(gòu)層次盡量少
  2. 腳本放最好在</body>前
  3. 首屏樣式內(nèi)聯(lián)放在<head>內(nèi),樣式結(jié)構(gòu)盡量簡單
  4. 減少DOM操作,盡量緩存訪問DOM的樣式信息
  5. 減少通過javascript代碼修改樣式,多操作class
  6. 動畫盡量使用在絕對定位或固定定位的元素上
  7. 緩存DOM查找,查找器盡量簡潔
  8. 涉及多域名的網(wǎng)站,可以開旗域名預解析

參考文章:前端頁面渲染機制-熊 建剛

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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容