一個頁面從輸入URL到頁面載入顯示完成,這個過程都發生了什麼?

来源:http://www.cnblogs.com/tianjuan/archive/2016/10/13/5957551.html
-Advertisement-
Play Games

對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式,下麵的詳細過程針對"在地址欄輸入URL,按enter(回車)鍵載入資源"此種操作方式做解析,其它的方式的過程大同小異,差異會在後面再做分析。 1. 瀏覽器開啟一個線程來處理這個請求,對URL判斷如果是http協議就按照web方式處理; ...


對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式,下麵的詳細過程針對"在地址欄輸入URL,按enter(回車)鍵載入資源"此種操作方式做解析,其它的方式的過程大同小異,差異會在後面再做分析。

  1. 瀏覽器開啟一個線程來處理這個請求,對URL判斷如果是http協議就按照web方式處理;

  2. 瀏覽器先查看瀏覽器緩存-系統緩存-路由器緩存,如果緩存中有,會直接在屏幕中顯示頁面內容(此時沒有向服務端發請求)。若沒有,則進行下一步操(後面需要向服務端發送請求);

  3. 通過DNS解析獲取網址的IP地址;

  4. 向真實IP地址伺服器發起tcp連接,與瀏覽器建立tcp三次握手。

  5. 握手成功後,進行HTTP協議會話,瀏覽器發送報頭(請求報頭);

  6. 進入到web伺服器上的 Web Server,如 ApacheTomcatNode.JS 等伺服器;

  7. 進入部署好的後端應用,如 PHPJavaJavaScriptPython 等,找到對應的請求處理;

  8處理結束回饋報頭,將數據返回至瀏覽器;

  9. 瀏覽器開始下載html文檔(響應報頭,狀態碼200),同時設置緩存;

  10. 之後瀏覽器對整個 HTML 結構進行解析,形成 DOM 樹;與此同時,它還需要對相應的 CSS 文件進行解析,形成 CSS 樹(CSSOM)。    

       接下來,需要結合 DOM + CSSOM,形成一個繪製樹(Render Tree);

  11. 得到繪製樹之後,需要計算每個結點在頁面中的位置,這一個過程稱為layout

  12. layout的過程是在一個連續的二維平面上進行的,接下來,需要將這些結果柵格化,映射到屏幕的離散二維平面上,這一過  

       程稱為 paint ;  現代瀏覽器為提升性能,將頁面劃分多個 layer,各自進行 paint 然後組合成一個頁面(composite layers)。

 

PS: 開頭說到的"對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式"中其他方式的過程與上面方式差不多,只是在處理緩存這一環節上有些不同:

1. “轉至”或地址欄里回車刷新:見上

2. F5刷新:沒有第2步,在第8步判斷返回值,如果返回304則表示有緩存,且此時直接用緩存;如果返回200則表示沒有緩存,順序執行至最後

3. Ctrl+F5刷新網頁的區別:沒有第2步,且在第8步一定返回200並順序執行至最後

(對於以上3種不同方式更好的應該從http協議的緩存機制上做區分更容易理解,此處更側重'向服務端發送請求及其返回值'這方面做一下區別)

 

 

PS: 10-12步更側重於前端渲染頁面過程,詳細可參考:http://www.jianshu.com/p/016e8e78eb1f

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]動畫狀態 [2]停止動畫 [3]動畫延遲 [4]全局控制 ...
  • 踩過的坑都將成為路上的風景。隊友在cookie中已存以下值: 仔細觀摩,並無發現任何不妥,只是一種簡簡單單的json格式字元串而已。 但在前臺調用時,百試不爽,屢屢出錯,錯誤代碼如下,一直顯示undefined ... 充電之後 ... 加上JSON.parse()處理後,完美解決 相關學習: JS ...
  • 1.等腰三角形 2.直角三角形 3.圓 4.橢圓 ...
  • css參考手冊: http://www.phpstudy.net/css3/ http://www.css88.com/book/css/ ...
  • 一、JS實現瀑布流 index.html:頁面結構 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>瀑布流佈局</title> 6 <link rel="stylesheet" href= ...
  • [1]queue() [2]dequeue() [3]clearQueue() ...
  • 聖杯佈局和雙飛翼佈局主要用來解決以下問題: 1.三列佈局,兩側定寬,中間自適應。2.中間欄在瀏覽器中優先載入渲染。 解決思路: 首先把中間的div寫到前面,然後左側,然後右側。這樣就解決了第二個問題,中間的div優先渲染。 但是這樣會存在一個問題,寫到前面的也會顯示在前面。 為瞭解決這個問題,我們讓 ...
  • 構建了公司網站之後,接下來就可以考慮設計一個線上商店了。 此次的設計以上一章的設計為基礎, 只是添加了一個包含如下元素的新頁面: □ 包含商品小圖、標題和說明的產品網格; □ 位於左側的變懶,用於按類別、品牌等篩選商品; □ 方便用戶導航的麵包屑和分頁鏈接。 大家先看一看Zappos (http:/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...