為什么要了解瀏覽器的加載、解析、渲染這幾個過程
- 了解瀏覽器如何進行加載,我們可以在引用外部樣式文件,外部js文件時,將他們放到合適的位置,使瀏覽器以最快的速度將文件加載完畢。
- 了解瀏覽器如何進行解析,我們可以在構建DOM結構,組織css選擇器時,選擇最優的寫法,提高瀏覽器的解析速率。
- 了解瀏覽人如何進行渲染,我們可以在設置元素屬性,編寫js文件時,可以減少"重排""重繪"的消耗。
這三個過程在事件進行的時候不是完全獨立,會有交叉。會一邊加載,一遍解析,一遍渲染的工作想象。
瀏覽器是如何進行加載、解析、渲染的呢?
- 用戶訪問網頁,DNS服務器會根據用戶提供的域名查找對應的IP地址,找到后,系統會向對應IP地址的網絡服務器發送一個http請求。
- 網絡服務器解析請求后,并發送請求給數據庫服務器。
- 數據庫服務器將請求的資源返回給網絡服務器,網絡服務器解析數據,并生成html文件,放入http response中,返回給瀏覽器。
- 瀏覽器解析 http response。訪問服務器可能遭遇的問題:如果網絡服務器無法獲取數據庫服務器返回的資源文件(就會響應 http response 404),或者由于并發原因暫時無法處理用戶的http請求(http response 500)
- 瀏覽器解析 http response后,需要下載html 文件,以及html文件內包含外部引用文件,以及文件內涉及的圖片或者多媒體文件。
加載
瀏覽器五個常駐線程:
1 瀏覽器GUI渲染線程
2 js引擎線程
3 瀏覽器定時器觸發線程
4 瀏覽器事件觸發線程
5 瀏覽器http異步請求線程。
當js引擎線程(第2個)進行時,會掛起其他一切線程。由于js引擎為單線程,所以代碼都是先壓到隊列中,采用先進先出的方式運行,事件處理函數,timer函數也會壓到隊列中,不斷的從隊頭取出事件。
瀏覽器加載過程中遇到外部css文件,瀏覽器會另外發一個請求,來獲取css文件。遇到圖片資源,瀏覽器會發出另一個請求,來獲取圖片。但是當文檔加載過程中遇到js文件時,html文檔會掛起渲染線程(加載解析渲染同步),不僅要等待文檔中js文件加載完畢,還要等待解析執行完畢,才可以恢復html文檔的渲染線程。
雖然css文件的加載不影響js文件的加載,但是卻影響js文件的執行,即使js文件內只有一行代碼,也會造成阻塞。原因:某些js代碼,如:var width = $('#id').width()。這意味著,js代碼執行前,瀏覽器必須保證css文件已下載和解析完成。這是css阻塞后續js的根本原因。
解析
- html文檔解析生成解析樹,是由dom元素及屬性節點組成,樹的根是document對象。
- css解析將css文件解析為樣式表對象。改對象包含了css規則,該規則包含了選擇器和聲明對象。
- js解析因為文件在加載的同時也進行解析。
渲染
即為構建渲染樹的過程,他是原來DOM樹可視化表示。構建這棵樹是為了以正確的順序繪制文檔內容。