瀏覽器加載和渲染html的順序

轉自:http://topic.csdn.net/u/20111124/21/ab0de63f-da83-4857-8eb0-6983f890d399.html?87567

前陣子,在組內給大家做了一次關於“瀏覽器加載和渲染HTML的順序”的分享(PS:這前面html幾個字在51testing上可能展示有點問題),這裏再總結一下吧。
1.瀏覽器加載和渲染html的順序
1、IE下載的順序是從上到下,渲染的順序也是從上到下,下載和渲染是同時進行的。
2、在渲染到頁面的某一部分時,其上面的所有部分都已經下載完成(並不是說所有相關聯的元素都已經下載完)
3、如果遇到語義解釋性的標籤嵌入文件(JS腳本,CSS樣式),那麼此時IE的下載過程會啓用單獨連接進行下載。
4、並且在下載後進行解析,解析過程中,停止頁面所有往下元素的下載。阻塞加載
5、樣式表在下載完成後,將和以前下載的所有樣式表一起進行解析,解析完成後,將對此前所有元素(含以前已經渲染的)重新進行渲染。
6、JS、CSS中如有重定義,後定義函數將覆蓋前定義函數
2. JS的加載
2.1 不能並行下載和解析(阻塞下載)
2.2 當引用了JS的時候,瀏覽器發送1個js request就會一直等待該request的返回。因爲瀏覽器需要1個穩定的DOM樹結構,而JS中很有可能有代碼直接改變了DOM樹結構,比如使用 document.write 或 appendChild,甚至是直接使用的location.href進行跳轉,瀏覽器爲了防止出現JS修改DOM樹,需要重新構建DOM樹的情況,所以 就會阻塞其他的下載和呈現.
3.如何加快HTML頁面加載速度
1,頁面減肥
頁面的肥瘦是影響加載速度最重要的因素
刪除不必要的空格、註釋
將inline的script和css移到外部文件
可以使用HTML Tidy來給HTML減肥,還可以使用一些壓縮工具來給JavaScript減肥
2,減少文件數量
減少頁面上引用的文件數量可以減少HTTP連接數
許多JavaScript、CSS文件可以合併最好合並,人家財幫子都把自己的JavaScript. functions和Prototype.js合併到一個base.js文件裏去了
3,減少域名查詢
DNS查詢和解析域名也是消耗時間的,所以要減少對外部JavaScript、CSS、圖片等資源的引用,不同域名的使用越少越好
4,緩存重用數據
使用緩存吧
5,優化頁面元素加載順序
首先加載頁面最初顯示的內容和與之相關的JavaScript和CSS
然後加載DHTML相關的東西
像什麼不是最初顯示相關的圖片、flash、視頻等很肥的資源就最後加載
6,減少inline JavaScript的數量
瀏覽器parser會假設inline JavaScript會改變頁面結構,所以使用inline JavaScript開銷較大
不要使用document.write()這種輸出內容的方法,使用現代W3C DOM方法來爲現代瀏覽器處理頁面內容
7,使用現代CSS和合法的標籤
使用現代CSS來減少標籤和圖像,例如使用現代CSS+文字完全可以替代一些只有文字的圖片
使用合法的標籤避免瀏覽器解析HTML時做“error correction”等操作,還可以被HTML Tidy來給HTML減肥
8,Chunk your content
不要使用嵌套tables
<table>
<table>
<table>
..
<table>
<table>
<table>

<table>
<table>
<table>
..
<table>
<table>
<table>

而使用非嵌套tables或者divs
<table>...</table>
<table>...</table>
<table>...</table>

<table>...</table>
<table>...</table>
<table>...</table>

將基於大塊嵌套的tables的layout分解成小tables,這樣顯示時不用加載整個頁面(或大table)的內容
9,指定圖像和tables的大小
如果瀏覽器可以立即決定圖像或tables的大小,那麼它就可以馬上顯示頁面而不要重新做一些佈局安排的工作
這不僅加快了頁面的顯示,也預防了頁面完成加載後佈局的一些不當的改變
image使用height和width
table使用table-layout: fixed並使用col和colgroup標籤指定columns的width
10,根據用戶瀏覽器明智的選擇策略
IE、Firefox、Safari等等等等
11,頁面結構的例子
· HTML

· HEAD

· LINK ...
CSS files required for page appearance. Minimize the number of files for performance while keeping unrelated CSS in separate files for maintenance.

· SCRIPT. ...
JavaScript. files for functions required during the loading of the page, but not any DHTML that can only run after page loads.
Minimize the number of files for performance while keeping unrelated JavaScript. in separate files for maintenance.

· BODY
· User visible page content in small chunks (tables / divs) that can be displayed without waiting for the full page to download.

· SCRIPT. ...
Any scripts which will be used to perform. DHTML. DHTML script. typically can only run after the page has completely loaded and all necessary objects have been initialized. There is no need to load these scripts before the page content. That only slows down the initial appearance of the page load.
Minimize the number of files for performance while keeping unrelated JavaScript. in separate files for maintenance.
If any images are used for rollover effects, you should preload them here after the page content has downloaded.



4.HTML頁面加載和解析流程
1.用戶輸入網址(假設是個html頁面,並且是第一次訪問),瀏覽器向服務器發出請求,服務器返回html文件; 
2.瀏覽器開始載入html代碼,發現<head>標籤內有一個<link>標籤引用外部CSS文件; 
3.瀏覽器又發出CSS文件的請求,服務器返回這個CSS文件; 
4.瀏覽器繼續載入html中<body>部分的代碼,並且CSS文件已經拿到手了,可以開始渲染頁面了; 
5.瀏覽器在代碼中發現一個<img>標籤引用了一張圖片,向服務器發出請求。此時瀏覽器不會等到圖片下載完,而是繼續渲染後面的代碼; 
6.服務器返回圖片文件,由於圖片佔用了一定面積,影響了後面段落的排布,因此瀏覽器需要回過頭來重新渲染這部分代碼; 
7.瀏覽器發現了一個包含一行Javascript代碼的<script>標籤,趕快運行它; 
8.Javascript腳本執行了這條語句,它命令瀏覽器隱藏掉代碼中的某個<div> (style.display=”none”)。杯具啊,突然就少了這麼一個元素,瀏覽器不得不重新渲染這部分代碼; 
9.終於等到了</html>的到來,瀏覽器淚流滿面…… 
10.等等,還沒完,用戶點了一下界面中的“換膚”按鈕,Javascript讓瀏覽器換了一下<link>標籤的CSS路徑; 
11.瀏覽器召集了在座的各位<div><span><ul><li>們,“大夥兒收拾收拾行李,咱得重新來過……”,瀏覽器向服務器請求了新的CSS文件,重新渲染頁面。

5.Yahoo對網頁設計性能的建議,個人感覺是說得非常好的。
英文版:http://developer.yahoo.com/performance/rules.html
中文翻譯:http://www.cnblogs.com/smjack/archive/2009/02/24/1396895.html

參考資料:
http://hideto.javaeye.com/blog/133384
http://blog.chinaacc.com/liuzhantao/blog/20100430-3015241029081.html



閱讀:

瀏覽器的工作原理:新式網絡瀏覽器幕後揭祕

 http://www.w3ctech.com/topic/48

該文章講訴了瀏覽器的加載順序,以及html解析器,css和js解析器。其中也講述了 處理腳本和樣式表的順序 ;注意其中Firefox 在樣式表加載和解析的過程中,會禁止所有腳本。而對於 Webkit 而言,僅當腳本嘗試訪問的樣式屬性可能受尚未加載的樣式表影響時,它纔會禁止該腳本。


閱讀:

瀏覽器的工作原理:新式網絡瀏覽器幕後揭祕

 http://www.w3ctech.com/topic/48
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章