目錄
瀏覽器打開網頁的過程
瀏覽器載入和渲染html的順序
JS的載入
首頁 web前端 html教學 瀏覽器載入和渲染HTML的過程(標準定義的過程以及現代瀏覽器的最佳化)

瀏覽器載入和渲染HTML的過程(標準定義的過程以及現代瀏覽器的最佳化)

Aug 23, 2016 am 09:03 AM

先看一下標準定義的瀏覽器渲染過程(網上找的):

瀏覽器打開網頁的過程

  1. 用戶第一次訪問網址,瀏覽器向伺服器發出請求,伺服器返回html檔;

  2. 瀏覽器開始載入html程式碼,發現head 標籤內有一個link 標籤引用外部CSS或JS檔案;

  3. 瀏覽器又發出CSS及JS檔案的請求,伺服器回傳這個CSS,JS檔案;

  4. 瀏覽器繼續載入html中body 部分的程式碼,並且CSS,JS檔案已經拿到手了,可以開始渲染頁面了;

  5. 瀏覽器在程式碼中發現一個img 標籤引用了一張圖片,向伺服器發出請求。 此時瀏覽器不會等到圖片下載完,而是繼續渲染後面的程式碼

  6. 伺服器返回圖片文件,由於圖片佔用了一定面積,影響了頁面佈局,因此瀏覽器需要回頭重新渲染這部分代碼;

  7. 瀏覽器發現了一個包含一行Javascript代碼的script 標籤,趕快執行它;

  8. Javascript腳本執行了這條語句,它命令瀏覽器隱藏掉代碼中的某個p (style.display=”none”)。杯具啊,突然就少了這麼一個元素,瀏覽器不得不重新渲染這部分程式碼;

  9. 終於等到了html 的到來,瀏覽器淚流滿面…

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

  1. IE瀏覽器下載的順序是從上到下,渲染的順序也是從上到下,下載和渲染是同時進行的。

  2. 在渲染到頁面的某一部分時,其上面的所有部分都已經下載完成(並不是說所有相關聯的元素都已經下載完)

  3. 如果遇到語義解釋性的標籤嵌入檔案(JS腳本,CSS樣式),那麼此時IE的下載過程會啟用單獨連線進行下載。

  4. 並且在下載後進行解析,解析過程中,停止頁面所有往下元素的下載,阻塞加載

  5. 樣式表在下載完成後,將和先前下載的所有樣式表一起進行解析,解析完成後,將對此前所有元素(含以前已經渲染的)重新進行渲染。

  6. JS、CSS中如有重定義,後定義函數將覆寫前定義函數。

JS的載入

  • 不能並行下載和解析(阻塞下載)

  • web的模式是同步的,開發者希望解析到一個腳本標籤時並執行一個腳本,的解析直到腳本執行完;如果腳本是外引的,當引用了JS的時候,瀏覽器發送一個js request就會一直等待該request的返回,這個過程也是同步的,會阻塞文檔的解析直到資源被請求到。因為瀏覽器需要一個穩定的DOM樹結構,而JS中很有可能有程式碼直接改變了DOM樹結構,例如使用document.write 或appendChild,甚至是直接使用的location.href進行跳轉,瀏覽器為了防止出現JS修改DOM樹,需要重新建構DOM樹的情況,所以就會阻塞其他的下載和呈現。這個模式維持了很多年,並且在html4及html5中都特別指定了。開發者可以將腳本標識為defer,使其不阻塞文件解析,並在文件解析結束後執行。 Html5增加了標記腳本為非同步的選項,以使腳本的解析執行使用另一個執行緒。

 

這裡面有幾點需要說明一下:

  1.我們知道瀏覽器的處理過程是解析html生成DOM tree->根據DOM tree和樣式表生成render tree->render展示。瀏覽器為了讓使用者更快的看到頁面,所以是邊解析html產生局部的DOM tree,瀏覽器就產生部分render tree然後展示出來。

  2.此過程中有兩種外部資源是阻塞腳本執行,從而阻塞渲染的,分別是外部js和外部css。 外部js是阻塞了DOM tree的生成,因為瀏覽器需要一個穩固的DOM tree,而js可能破壞這個結構(當然其中也可能會更改樣式【注意是樣式而不是樣式表】,但是這個不阻塞也不會有影響的);外部css樣式表也會阻塞腳本的執行,理論上,既然樣式表不改變Dom樹,也就沒有必要停下文檔的解析等待它們,然而,存在一個問題,腳本可能在文檔的解析過程中請求樣式信息,如果樣式還沒有加載和解析,腳本將得到錯誤的值,顯然這將會導致很多問題,這看起來是個邊緣情況,但確實很常見。 Firefox在存在樣式表還在載入和解析時阻塞所有的腳本,而Chrome只在當腳本試圖存取某些可能被未載入的樣式表所影響的特定的樣式屬性時才阻塞這些腳本。

  3.其他外部資源是不阻塞渲染的,比如圖片,我們能看到很多時候頁面大體的框架都呈現出來了,就是圖片的位置沒有顯示出來的情況,等到圖片下載下來以後再重新渲染。

 

現代瀏覽器的最佳化:

  依照標準的瀏覽器渲染下載流程。下面的程式碼載入外部資源的順序應該和資源在html中的順序一致。其中head添加了一個外部資源請求http://hm.baidu.com/hm.js?a0​​41a0f4ff93aef6aa83f34134331a1d㟎ee  但是實際上在chrome。 Firefox、ie8+等瀏覽器中卻發現是以下效果(使用https://www.webpagetest.org/測試)  

  為什麼?這就是

預解析(Speculative parsing)

  

Webkit和Firefox都做了這個優化,當執行腳本時,另一個線程解析剩下的文檔,並加載後面需要通過

網絡加載的資源 。這種方式可以使資源並行載入從而使整體速度更快。要注意的是,預解析並不會改變Dom樹,它將這個工作留給主解析過程,自己只解析外部資源的引用,例如外部腳本、樣式表及圖片。   如上面的那張圖,可以看出在執行腳本的時候與解析了一大堆的外部資源引用,並啟動線程下載他們,主線程還在等待hm.js的返回。

以上就是瀏覽器載入和渲染HTML的過程(標準定義的過程以及現代瀏覽器的最佳化)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML:結構,CSS:樣式,JavaScript:行為 HTML:結構,CSS:樣式,JavaScript:行為 Apr 18, 2025 am 12:09 AM

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML:建立網頁的結構 HTML:建立網頁的結構 Apr 14, 2025 am 12:14 AM

HTML是構建網頁結構的基石。 1.HTML定義內容結構和語義,使用、、等標籤。 2.提供語義化標記,如、、等,提升SEO效果。 3.通過標籤實現用戶交互,需注意表單驗證。 4.使用、等高級元素結合JavaScript實現動態效果。 5.常見錯誤包括標籤未閉合和屬性值未加引號,需使用驗證工具。 6.優化策略包括減少HTTP請求、壓縮HTML、使用語義化標籤等。

HTML的未來:網絡設計的發展和趨勢 HTML的未來:網絡設計的發展和趨勢 Apr 17, 2025 am 12:12 AM

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML:是編程語言還是其他? HTML:是編程語言還是其他? Apr 15, 2025 am 12:13 AM

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增強WebevebDevelopment。

解決 Craft CMS 中的緩存問題:使用 wiejeben/craft-laravel-mix 插件 解決 Craft CMS 中的緩存問題:使用 wiejeben/craft-laravel-mix 插件 Apr 18, 2025 am 09:24 AM

在使用CraftCMS開發網站時,常常會遇到資源文件緩存的問題,特別是當你頻繁更新CSS和JavaScript文件時,舊版本的文件可能仍然被瀏覽器緩存,導致用戶無法及時看到最新的更改。這個問題不僅影響用戶體驗,還會增加開發和調試的難度。最近,我在項目中遇到了類似的困擾,經過一番探索,我找到了wiejeben/craft-laravel-mix這個插件,它完美地解決了我的緩存問題。

apache服務器是什麼 apache服務器是乾嘛的 apache服務器是什麼 apache服務器是乾嘛的 Apr 13, 2025 am 11:57 AM

Apache服務器是強大的Web服務器軟件,充當瀏覽器與網站服務器間的橋樑。 1. 它處理HTTP請求,根據請求返回網頁內容;2. 模塊化設計允許擴展功能,例如支持SSL加密和動態網頁;3. 配置文件(如虛擬主機配置)需謹慎設置,避免安全漏洞,並需優化性能參數,例如線程數和超時時間,才能構建高性能、安全的Web應用。

Nginx性能監控與故障排查工具使用 Nginx性能監控與故障排查工具使用 Apr 13, 2025 pm 10:00 PM

Nginx性能監控與故障排查主要通過以下步驟進行:1.使用nginx-V查看版本信息,並啟用stub_status模塊監控活躍連接數、請求數和緩存命中率;2.利用top命令監控系統資源佔用,iostat和vmstat分別監控磁盤I/O和內存使用情況;3.使用tcpdump抓包分析網絡流量,排查網絡連接問題;4.合理配置worker進程數,避免並發處理能力不足或進程上下文切換開銷過大;5.正確配置Nginx緩存,避免緩存大小設置不當;6.通過分析Nginx日誌,例如使用awk和grep命令或ELK

解構H5代碼:標籤,元素和屬性 解構H5代碼:標籤,元素和屬性 Apr 18, 2025 am 12:06 AM

HTML5代碼由標籤、元素和屬性組成:1.標籤定義內容類型,用尖括號包圍,如。 2.元素由開始標籤、內容和結束標籤組成,如內容。 3.屬性在開始標籤中定義鍵值對,增強功能,如。這些是構建網頁結構的基本單位。

See all articles