自上而下加載,加載過程當中解析渲染
加載中遇到外部css,img會發出異步請求,不會影響文檔加載
加載中遇到js文件會掛起渲染進程,要等js加載和執行完,才恢復html渲染線程(由於js會修改DOM,document.write,解決方法是把js引用放在前)
css加載不影響js文件加載,但卻影響js文件的執行,即便js只有一行代碼也會形成阻塞(
緣由:$(「#id」).width(),js執行前,css必須下載解析完成,這事css阻塞後續js的緣由。解決辦法:當js不須要依賴css時能夠放在頭部css前面
)
不要在外部調用的js文件中調用運行時間較長的函數,若是必定要用,可使用setTimeout函數。
緣由:瀏覽器有以上五個常駐線程
一、瀏覽器GUI渲染線程
二、javascript引擎線程
三、瀏覽器定時器觸發線程(setTimeout)
四、瀏覽器事件觸發線程
五、瀏覽器http異步請求線程(.jpg
這類請求)
這裏也涉及到 阻塞 的現象,當js引擎線程(第二個)進行時,會掛起其餘一切線程,這個時候三、四、5這三類線線程也會產生不一樣的異步事件(這句話不懂啊),因爲 javascript引擎線程爲單線程,因此代碼都是先壓到隊列,採用先進先出的方式運行,事件處理函數,timer函數也會壓在隊列中,不斷的從隊頭取出事件,這就叫:javascript-event-loop。
現代瀏覽器存在 prefetch 優化,瀏覽器會另外開啓線程,提早下載js、css文件,須要注意的是,預加載js並不會改變dom結構,他將這個工做留給主加載。
若是js不會改變文檔,能夠在script標籤加 defer 使瀏覽器先在加載後面的文檔javascript
解析
html文檔解析生成解析樹即dom樹,是由dom元素及屬性節點組成,樹的根是document對象。
css解析將css文件解析爲樣式表對象。該對象包含css規則,該規則包含選擇器和聲明對象。
js解析由於文件在加載的同時也進行解析,詳看js加載部分。css
渲染
渲染最大的一個困難就是爲每個dom節點計算符合他的最終樣式。
#test p{ color:#999999}
遍歷是自右向左,也就是先查詢到p元素,再找到上一級id爲test的元素。css解析時,生成的樣式對象,從樹的低端向上遍歷。
樣式數據是很是大的結構,保存這樣是的數據是很耗內存
選擇器迭代太深,形成太多的無用遍歷
樣式規則涉及很是複雜的級聯,定義了規則的層次
渲染過程當中,webkit使用一個標誌位標誌全部頂層樣式都已經被加載完畢,若是dom元素進行attach時,css元素並無被加載完畢,則放置佔位符,並在文檔中標記,當樣式表加載完畢,則從新進行計算。
說明:文檔的渲染仍是要等待頂層css加載完畢。
頁面的渲染 須要首先生成dom樹,再由css生成CSSOM,最後兩個一塊兒生成render tree。html