html,css,js的下載 & 執行順序是什麼?

請描述一下從我們輸入網址, 點擊回車之後. html,css和js文件的下載和執行順序. 包括如下幾點:

1. html下載與執行是同步的嗎?

2. css文件的下載和渲染是同步的嗎? 還是先下載完, 再渲染?

3. css文件的下載執行 和 html文件的下載執行同步嗎?

4. 圖像的載入 和 html文件的下載/執行同步嗎, 音視頻呢, 別的資源呢?

5. js文件的下載執行和html文件的下載執行同步還是非同步?如果帶有async和defer呢?

6. 有沒有可能出現html文件/圖片/css文件/js文件同時下載的情況?

7. 有沒有可能出現html/css文件/js文件同時執行的情況?

8. 從數據流打開(document.open())到載入js文件(普通的, 帶有async屬性的, 帶有defer屬性的)到DOMContentLoaded事件觸發, 到數據流關閉(document.close()), 到window.onload事件觸發, 能否從頭到尾描述一下這個過程...

9. 描述整個過程時請帶上css屬性的相互覆蓋(是否會導致重新渲染), js修改DOM結構(是否會導致重新渲染), css屬性的合併, 覆蓋等等相互作用, js變數的覆蓋等相互作用等等...

10. 問了好多問題, 總之希望有人能從頭到尾描述一下這個過程(html, css, js, 圖片, 音視頻等資源的下載 + html, css, js等文件的執行)...或者有沒有描述這個過程的優秀的文章, 謝謝


瀉藥

這種問題……

1. 不一定,http 在主進程 io 線程中,parser 在渲染進程中,有並行基礎,是否並行則看具體情況,比如是否有 chunked。

2. 同1

3. 同1

4. 同1

5.同1,async和defer只是下載js時候不阻塞主文檔parser。

6. 同1,有,此時 html 要不就是 chunked 或者屬於內頁 iframe 的

7. 沒有,執行都在同進程同線程里,除非是多標籤頁內的不同資源「同時」執行……

8. 9. 10. https://cs.chromium.org/chromium/src/ 你可以自己看……


建議優先閱讀這篇譯文:現代瀏覽器的工作原理 - 文章 - 伯樂在線

閱讀之後,後面答案可以不用看。


1. html下載與執行是同步的嗎?

結論:分情況。

html執行這個描述不準確,所謂的執行包括parseHTML、layout、paint幾個階段。download、parseHTML/parseCSS/executeJS、layout、paint都在不同進程中。

parseHTML/parseCSS並行,共同完成後layout生成渲染樹,進而paint渲染。執行JS會重新回到layout階段。


A.如果網速足夠快,內容很快傳送完畢,那parse+layout+paint會靠後執行。

B.如果弱網環境下,針對網速很慢的情況現代瀏覽器是有優化的,會嘗試提前渲染已收到的內容,也就造成了pc上會看到頁面一塊一塊展現的狀況。

C.chunk原理類似,每個chunk斷點都有可能觸發解析渲染。

D.有些瀏覽器還會做首屏優化,下載過程中不斷嘗試parse+layout,如果layout計算出內容超過首屏就paint這些內容,讓用戶優先看到首屏內容。

大部分進程因為是並行的,會相對複雜,分情況討論意義不大,不如從原理上理解。


2. css文件的下載和渲染是同步的嗎? 還是先下載完, 再渲染?

不確定下載過程中是否同步做詞法分析parseCss,但是可能性很大,畢竟是種無損失的優化方案,

但是最終肯定需要下載完再layout生成渲染樹,進而渲染。

3. css文件的下載執行 和 html文件的下載執行同步嗎?

並行的。但是需要注意一些限制,比如一個域名下最大並發6個請求,再多就得串列。


4. 圖形的載入 和 html文件的下載/執行同步嗎, 音視頻呢, 別的資源呢?

同上。


5. js文件的下載執行和html文件的下載執行同步還是非同步?如果帶有async和defer呢?

下載,但不executeJS


6. 有沒有可能出現html文件/圖片/css文件/js文件同時下載的情況?

常態。


7. 有沒有可能出現html/css文件/js文件同時執行的情況?

你讀了上面文章就能理解了:html parse和css parse是並行的,兩者完成後才會layout、paint,新的css掛載會延遲layout、paint。js parse會阻塞html parse ,所以後面的layout、paint一定不會同時執行。

你問到8、9、10說明對性能優化已經有一些意識了,讀上面文章吧,讀懂了問題迎刃而解。


這些問題很典型,也比較全面考察知識點,答案也並不絕對,秉承授人以魚,不如授人以漁的精神,建議你靜下心來好好學習,總結一次,自己去尋找答案,收穫會很大的,當然如果你只想快捷獲取答案,前面好些大拿都給出了大致回答。

關於瀏覽器工作原理主題,google,baidu都是一大堆,推薦一篇比較權威的:

How browsers work

這篇文章,是我看過最全面的,如果不喜歡讀英文,我個人也寫過一篇,儘可能寫的簡潔,清晰:

淺析前端頁面渲染機制 ,希望對你有幫助。

熱愛前端,熱愛分享。


這個問題應該叫做網頁的渲染過程
1. css js 圖片 各種資源都在html裡面的 html不解析 這些沒得談 所以html是第一個下載下來肯定沒問題的
2. css 的載入和渲染 js的載入和執行 可以自行百度查一下 我只是即興回答下 不想擴展開寫了
這也是一個前端常見的面試題之一


1, html下載與執行是同步的嗎?

這個執行是什麼?JS還是HTML結構的計算?如果是前者那答案:我猜是,要不幹嘛JS放在最後面?如果是後者:我猜答案不是,畢竟計算和下載不是同一個玩意乾的

2. css文件的下載和渲染是同步的嗎? 還是先下載完, 再渲染? 我猜答案是一邊下載一邊渲染

3. css文件的下載執行 和 html文件的下載執行同步嗎? 這個問題都是計算渲染,我猜答案是

4. 圖形的載入 和 html文件的下載/執行同步嗎, 音視頻呢, 別的資源呢? 不是同步,要不。。你視頻載入不完HTML不渲染了?

5. js文件的下載執行和html文件的下載執行同步還是非同步?如果帶有async和defer呢?

我猜前面同步,後面非同步

6. 有沒有可能出現html文件/圖片/css文件/js文件同時下載的情況? 兄弟本身就是同時下載,V8可以同時發出多個請求(我記得是五個),當然是同時下載。

7. 有沒有可能出現html/css文件/js文件同時執行的情況? 不是同一個玩意管著為什麼不可以?JS是js解析模塊管,HTML/CSS是渲染管著唄。兩個人管兩塊為嘛不同時幹活?

8,不幹,太長

9. 描述整個過程時請帶上css屬性的相互覆蓋(是否會導致重新渲染), js修改DOM結構(是否會導致重新渲染), css屬性的合併, 覆蓋等等相互作用, js變數的覆蓋等相互作用等等...

我猜 第一個會,第二個會。CSS是下載-計算 再下載-再計算的過程

10.以上都是我猜的,如果你要實名反對,

我也只能看著。。


推薦閱讀:

如何評價螞蟻金服體驗技術部推出的數據可視化解決方案 AntV?
Web 前端自學,有哪些建議?
數據可視化的web前端開發採用什麼樣的架構比較合適?
我想做web前端,怎麼學習 ?
現如今web前端好就業嗎?工作好找嗎?

TAG:前端開發 | HTML | CSS | JavaScript | 前端工程師 |