瀏覽器是怎樣載入js代碼的?
HTML中有對js文件的外部引用,那麼當這個HTML文件交給瀏覽器時,瀏覽器會展示這個頁面,但是這個時候js文件還儲存在伺服器端,那麼瀏覽器是怎樣將這個js文件從伺服器上載入到本地的?整個的過程是怎樣的?
就像正常的下載文件一樣。把服務的js文件下載下來,然後在本地瀏覽器執行。
另外你需要補充一下瀏覽器載入、解析、渲染的一些知識。複製一下我之前整理的筆記。
瀏覽器載入
- 載入過程
當瀏覽器獲得一個html文件時,會」自上而下「載入,並在載入過程中進行解析渲染。
載入過程中遇到外部css文件,瀏覽器另外發出一個請求,來獲取css文件。 遇到圖片資源,瀏覽器也會另外發出一個請求,來獲取圖片資源。這是非同步請求,並不會影響html文檔進行載入。 但是當文檔載入過程中遇到js文件,html文檔會掛起渲染(載入解析渲染同步)的線程,不僅要等待文檔中js文件載入完畢,還要等待解析執行完畢,才可以恢復html文檔的渲染線程。 - 載入外聯js和css的阻塞情況
一個不太嚴謹但方便記憶的口訣:JS 全阻塞,CSS 半阻塞
- JS 會阻塞後續 DOM 解析以及其它資源(如 CSS,JS 或圖片資源)的載入。
- CSS不阻塞DOM的載入和解析(它只阻塞DOM的渲染呈現。這裡談載入),不會阻塞其它資源(如圖片)的載入,但是會阻塞 後續JS 文件的執行(原因之一是,js執行代碼可能會依賴到css樣式。css只阻塞執行而不阻塞js的載入)。
- 鑒於上面的特性,當css後面存在js的時候,css會間接地阻塞js後面資源的載入(css阻塞js,js阻塞其他資源 )。
- 現代瀏覽器會進行 prefetch 優化,瀏覽器在獲得 html 文檔之後會對頁面上引用的資源進行提前下載
外聯js文件使用defer屬性和asyn可以達到非同步非阻塞載入的效果,由於現代瀏覽器都存在 prefetch,所以 defer, async 可能並沒有太多的用途,可以作為了解擴展知識,僅僅將腳本文件放到 body 底部(但還是在&