瀏覽器解析Html一般是邊下載邊渲染么?如果是邊下載邊渲染的話,Html又使用GZIP格式傳輸,如何能夠做到沒有完全下載就可以渲染的呢?
01-14
因為gzip是流式的壓縮格式,可以做到邊下載邊解壓。
另外有個概念的問題,不是說html是gzip壓縮後的格式,而是HTTP協議可以使用gzip壓縮的方式來傳輸html文件。瀏覽器先下載html,然後在內存中把html代碼轉化成Dom Tree,然後瀏覽器根據Dom Tree上的Node分析css(sandbox modle )和Images【所以css和images是並行下載】,當文檔下載遇到js時,js獨立下載(因為在js中很可能存在有影響Dom Tree結構的代碼,如document.write,所以瀏覽器設計js為獨立進程,另:行間js將阻塞所有html代碼的下載),最後瀏覽器完成頁面渲染,形成最終的「呈現樹」(Render Tree或Frame Tree)。至於Gzip壓縮,如蔣又新所言:gzip壓縮是指http協議傳輸過程中使用的一種壓縮方式,屬於概念理解問題
我並不贊同玉伯所說的「HTML 下載完之後才開始解析並開始請求外部資源」。瀏覽器沒有開始請求外部資源不代表瀏覽器沒有開始解析 HTML,所以瀑布圖不能說明問題。
我在這寫這個答案的時候,還沒有進行針對性的測試。我暫且只寫下未證實的假設:
如果瀏覽器希望儘快呈現頁面,那麼它應該會儘早解析已下載的 HTML 代碼片斷,並且儘早請求外部資源。HTML 代碼的下載、解析、請求外部資源的這幾條線應該是流式的、並行的。
html 是先下載的,下載完成之後,再邊解析,邊下載相關資源,看下瀑布圖就清楚了。
2011-07-16 補充:
我說是的是伺服器沒 flush 的情況。當有 flush,內容 chunked 輸出時,瀏覽器會下載一塊後就立刻解析這一塊。當 flush 的間隔時間合理時,可以達到漸進式渲染的效果。Facebook 和 Amazon 等都用到了 chunked 輸出。
沒有 trunked 時,整個 html 是連續從伺服器輸出到瀏覽器端的,這時從瀑布圖等上看,瀏覽器是等到都下載完成了才開始解析。這方面的資料太少了,歡迎達人深入研究下,我的答案沒做太多深入鑽研,有任何問題,歡迎指正。
是一邊接收包一邊解析的,至於怎麼實現的?在分段傳輸包的時候,每一個小的包都是一個完整的gzip格式。要是自始至終是一個gzip包,客戶端就算是分段接收也是沒辦法實現解析的。
應該是邊下載邊解析。facebook的bigpipe就是把整個頁面分解成小塊來載入的,最後才是html的結束標籤。收到一部分代碼之後解析這部分。樓主現在找到確定的答案了嗎,我也不確定。歡迎討論
從顯示效果上看是邊下載邊解析的,如果不是的話,停止下載的時候要麼顯示全部要麼一點不顯示
推薦閱讀:
※為什麼 HTTP header 中 Content-Type 這一條目的寫法是 charset 在 content 的屬性裡面?
※大家是如何知道 nctype="multipart/form-data" 的功能是以二進位上傳文件的?
※如何學好 HTML ?
※學完了html和css怎麼做靜態網頁啊,沒有頭緒,初學者都是這樣的么,感覺手拿筷子,不知道怎麼用?
※第一次看HTML教程是怎樣一種體驗?