一:爲何要了解瀏覽器渲染頁面和加載頁面機制,主要仍是性能的優化。javascript
這三個過程在實際進行的時候又不是徹底獨立,而是會有交叉。會形成一邊加載,一邊解析,一邊渲染的工做現象。css
二:用戶訪問網頁都發生了什麼。html
1~4步驟HTTP協議的一些內容,訪問服務器端可能遭遇的問題:若是網絡服務器沒法獲取數據庫服務器返回的資源文件(http response 404),或者因爲併發緣由暫時沒法處理用戶的http請求(http response 500)。java
三:瀏覽器渲染頁面和解析加載頁面機制。數據庫
a.加載,即爲獲取資源文件的過程,不一樣瀏覽器,以及他們的不一樣版本在實現這一過程時,會有不一樣的實現效果(資源間互相阻塞,能夠用timeline來作測試)。這裏先說下瀏覽器的5個常駐線程:瀏覽器
備註:現代瀏覽器存在 prefetch 優化,瀏覽器會另外開啓線程,提早下載js、css文件,須要注意的是,預加載js並不會改變dom結構,他將這個工做留給主加載。服務器
注意:這裏也涉及到 阻塞 的現象,當js引擎線程(第二個)進行時,會掛起其餘一切線程,這個時候三、四、5這三類線程也會產生不一樣的異步事件,因爲 javascript引擎線程爲單線程,因此代碼都是先壓到隊列,採用先進先出的方式運行,事件處理函數,timer函數也會壓在隊列中,不斷的從隊頭取出事件,這就叫:javascript-event-loop。簡單點說應該是當在進行第二線程的時候,1,3,4,5都會掛起,好比這時候觸發click事件,即便先前JS已經加載完成,click事件會壓在隊列裏,這裏也要先完成第二線程纔會執行click事件。網絡
加載順序:併發
緣由:JS有可能會修改DOM,最爲經典的document.write,這意味着,在JS執行完成前,後續全部資源的下載多是沒有必要的,這是js阻塞後續資源下載的根本緣由。
辦法:能夠將外部引用的js文件放在</body>前。dom
4. css可能影響js的執行形成阻塞。
緣由:如js裏面var width = $('#id').width();這裏js執行前,瀏覽器必須保證以前的css文件已下載和解析完成(後面的不會影響),這也是css阻塞後續js的根本緣由。當js文件不須要依賴css文件時,能夠將js文件放在頭部css的前面。
5. 預加載網頁,利用空餘時間來提早加載該網頁的後續網頁。
<link rel="prefetch" href="http://">
6. 爲js腳本添加defer屬性,其不會阻塞後續DOM的的渲染。可是由於這個defer只是IE專用,因此通常用得比較少。而咱們標準的的HTML5也加入了一個異步載入javascript的屬性:async,不管你對它賦什麼樣的值,只要它出現,它就開始異步加載js文件。可是, async的異步加載會有一個比較嚴重的問題,那就是它忠實地踐行着「載入後立刻執行」這條軍規,因此,雖然它並不阻塞頁面的渲染,可是你也沒法控制他執行的次序和時機。
<script defer="true" src="JavaScript.js" type="text/javascript"/>
mark--zhq[2]。