HTTP請求與緩存、頁面渲染全流程

文章目錄

  • 前言
    • **1. HTTP請求與緩存處理**
      • **緩存機制**
        • ? 強緩存(Cache-Control / Expires)
        • ? 協商緩存(Last-Modified / ETag)
    • **2. 服務器響應與數據解析**
    • **3. HTML DOM 構建**
    • **4. CSSOM 構建**
    • **5. 渲染樹(Render Tree)生成**
    • **6. 布局(Layout / Reflow)**
    • **7. 繪制(Painting)**
    • **8. 合成(Compositing)與顯示**
    • **總結:從請求到渲染的完整流程**


前言

HTTP請求與緩存、頁面渲染全流程

當用戶在瀏覽器輸入URL并按下回車,到頁面最終渲染到屏幕上,整個過程涉及多個關鍵步驟:

  1. HTTP請求與緩存處理
  2. 服務器響應與數據解析
  3. HTML DOM 構建
  4. CSSOM 構建
  5. 渲染樹(Render Tree)生成
  6. 布局(Layout/Reflow)
  7. 繪制(Painting)
  8. 合成(Compositing)與顯示

1. HTTP請求與緩存處理

瀏覽器在發起HTTP請求前,會先檢查緩存策略,以減少不必要的網絡請求。

緩存機制

? 強緩存(Cache-Control / Expires)

? 瀏覽器檢查Cache-Control(優先級更高)或Expires,判斷資源是否過期。

? 如果未過期,直接從內存緩存(Memory Cache)或磁盤緩存(Disk Cache)讀取,不發送HTTP請求。

? 示例:

```http
Cache-Control: max-age=3600  // 1小時內有效
Expires: Wed, 21 Oct 2025 07:28:00 GMT
```
? 協商緩存(Last-Modified / ETag)

? 如果強緩存失效,瀏覽器會向服務器發送請求,攜帶If-Modified-Since(基于Last-Modified)或If-None-Match(基于ETag)。

? 服務器檢查資源是否變化:

? 304 Not Modified:資源未變,瀏覽器繼續使用緩存。  ? 200 OK:資源已更新,返回新數據。  

? 示例:

```http
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
ETag: "33a64df551425fcc55e4d42a148795d9"
```

2. 服務器響應與數據解析

? 服務器返回HTTP Response,包含:

? 狀態碼(200 OK / 304 Not Modified / 404 Not Found)

? 響應頭(Content-TypeCache-Control等)

? 響應體(HTML、CSS、JS等)

? 瀏覽器解析流程:

  1. 解析HTML → 構建DOM樹
  2. 解析CSS → 構建CSSOM樹
  3. 執行JS(可能阻塞DOM/CSSOM構建)
  4. 合并DOM + CSSOM → 生成Render Tree(渲染樹)
  5. 布局(Layout) → 計算元素位置
  6. 繪制(Paint) → 填充像素
  7. 合成(Composite) → 最終渲染到屏幕

3. HTML DOM 構建

? 解析HTML:

? 瀏覽器逐行讀取HTML,遇到<script>會暫停解析,執行JS(除非async/defer)。

? 解析完成后,生成DOM樹(Document Object Model)。

? DOM樹結構:

<html><head><title>Page</title></head><body><div>Hello</div></body>
</html>

Document
├─ <html>
│   ├─ <head>
│   │   └─ <title>Page</title>
│   └─ <body>
│       └─ <div>Hello</div>

4. CSSOM 構建

? 解析CSS:

? 瀏覽器解析<style>、外部.css文件,生成CSSOM(CSS Object Model)。

? CSSOM是樹狀結構,決定元素的最終樣式(層疊、繼承、優先級)。

? 示例:

body { font-size: 16px; }
div { color: red; }

CSSOM
├─ body { font-size: 16px; }
└─ div { color: red; }

5. 渲染樹(Render Tree)生成

? 合并DOM + CSSOM:

? 瀏覽器遍歷DOM樹,結合CSSOM,生成Render Tree(僅包含可見元素,如display: none不包含)。

? Render Tree = DOM + Computed Styles

? 示例:

Render Tree
├─ <html>
│   └─ <body>
│       └─ <div>Hello</div> (color: red, font-size: 16px)

6. 布局(Layout / Reflow)

? 計算元素位置:

? 瀏覽器計算每個節點的幾何信息(寬、高、位置)。

? 回流(Reflow):布局變化(如窗口大小改變、DOM修改)會觸發重新計算。

? 優化:

? 避免頻繁修改DOM(使用DocumentFragment)。

? 使用transform代替top/left減少回流。


7. 繪制(Painting)

? 填充像素:

? 瀏覽器遍歷Render Tree,調用GPU繪制每個節點(顏色、邊框、陰影等)。

? 重繪(Repaint):樣式變化但不影響布局(如color變化)僅觸發重繪。

? 優化:

? 減少復雜選擇器(如div > span + p)。

? 使用will-change提示瀏覽器優化繪制。


8. 合成(Compositing)與顯示

? GPU合成:

? 瀏覽器將不同層(如position: fixedopacity)交給GPU合成。

? 最終渲染:合成后的圖像顯示在屏幕上。

? 優化:

? 使用transformopacity觸發GPU加速(避免主線程計算)。


總結:從請求到渲染的完整流程

  1. HTTP請求 → 檢查緩存(強緩存/協商緩存)。
  2. 服務器響應 → 返回HTML/CSS/JS。
  3. 解析HTML → 構建DOM樹。
  4. 解析CSS → 構建CSSOM樹。
  5. 合并DOM+CSSOM → 生成Render Tree。
  6. 布局(Layout) → 計算元素位置。
  7. 繪制(Painting) → 填充像素。
  8. 合成(Compositing) → GPU渲染到屏幕。

關鍵優化點
? 緩存:合理設置Cache-ControlETag減少請求。
? 減少DOM操作:避免頻繁回流/重繪。
? CSS優化:減少選擇器復雜度,使用transform/opacity
? JS優化:async/defer避免阻塞DOM解析。

這樣,瀏覽器就能高效地從HTTP請求到最終渲染頁面! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79971.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

限流算法學習筆記(一)Go Rate Limiter

文章目錄 1. 背景與概述1.1 什么是速率限制1.2 Go Rate Limiter 的定義與價值 2. 核心思想與設計理念2.1 令牌桶算法的基本原理2.2 惰性評估設計2.3 多種處理策略的平衡2.4 簡單易用的偶發控制 3. 架構設計與組件3.1 整體架構3.2 Limiter 組件3.3 Reservation 組件3.4 Limit 類…

n8n工作流自動化平臺的實操:生成統計圖的兩種方式

1.成果展示 1.1n8n的工作流 牽涉節點&#xff1a;Postgres、Code、QuickChart、Edit Fields、HTTP Request 12.顯示效果 2.實操過程 2.1節點說明 2.1.1Postgres節點&#xff1a; 注&#xff1a;將明細數據進行匯總。 2.1.2code節點&#xff1a; 注&#xff1a;將 查詢的數…

JavaScript中數組和對象不同遍歷方法的順序規則

在JavaScript中&#xff0c;不同遍歷方法的順序規則和適用場景存在顯著差異。以下是主要方法的遍歷順序總結&#xff1a; 一、數組遍歷方法 for循環 ? 嚴格按數組索引順序遍歷&#xff08;0 → length-1&#xff09; ? 支持break和continue中斷循環 ? 性能最優&#xff0c;…

緩存(1):三級緩存

三級緩存是指什么 我們常說的三級緩存如下&#xff1a; CPU三級緩存Spring三級緩存應用架構&#xff08;JVM、分布式緩存、db&#xff09;三級緩存 CPU 基本概念 CPU 的訪問速度每 18 個月就會翻 倍&#xff0c;相當于每年增? 60% 左右&#xff0c;內存的速度當然也會不斷…

Android setContentView()源碼分析

文章目錄 Android setContentView()源碼分析前提setContentView() 源碼分析總結 Android setContentView()源碼分析 前提 Activity 的生命周期與 ActivityThread 相關&#xff0c;調用 startActivity() 時&#xff0c;會調用 ActivityThread#performLaunchActivity()&#xf…

uniapp自定義步驟條(可二開進行調試)

前言 有一個業務需求是需要一個步驟條&#xff0c;但是發現開源的都不太合適&#xff0c;所以就自己寫了一個。 開始 test.vue <template><view class"authenticateRecordDetails_container"><!-- 進度 --><view class"authenticateSte…

22、近端策略優化算法(PPO)論文筆記

近端策略優化算法&#xff08;PPO&#xff09;論文筆記 一、研究背景與目標二、**方法****3.1 策略梯度基礎****3.2 信任區域方法&#xff08;TRPO&#xff09;****3.3 剪切代理目標函數&#xff08;LCLIP&#xff09;****3.4 自適應KL懲罰系數****3.5 算法實現** 三、 L CLIP…

web 自動化之 Selenium 元素定位和瀏覽器操作

文章目錄 一、元素定位的八大方法1、基于 id/name/class/tag_name 定位2、基于 a 標簽元素的鏈接文本定位3、基于xpath定位4、css定位 二、瀏覽器操作1、信息獲取2、 瀏覽器關閉3、 瀏覽器控制 一、元素定位的八大方法 web 自動化測試就是通過代碼對網頁進行測試&#xff0c;在…

前端面經 作用域和作用域鏈

含義&#xff1a;JS中變量生效的區域 分類&#xff1a;全局作用域 或者 局部作用域 局部作用域&#xff1a;函數作用域 和 塊級作用域ES6 全局作用域:在代碼中任何地方都生效 函數中定義函數中生效&#xff0c;函數結束失效 塊級作用域 使用let或const 聲明 作用域鏈:JS查…

【C/C++】RPC與線程間通信:高效設計的關鍵選擇

文章目錄 RPC與線程間通信&#xff1a;高效設計的關鍵選擇1 RPC 的核心用途2 線程間通信的常規方法3 RPC 用于線程間通信的潛在意義4 主要缺點與限制4.1 缺點列表4.2 展開 5 替代方案6 結論 RPC與線程間通信&#xff1a;高效設計的關鍵選擇 在C或分布式系統設計中&#xff0c;…

兩種方法求解最長公共子序列問題并輸出所有解

最長公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是動態規劃領域的經典問題&#xff0c;廣泛應用于生物信息學&#xff08;如DNA序列比對&#xff09;、文本差異比對&#xff08;如Git版本控制&#xff09;等領域。本文將通過??自頂向下遞歸記憶化??…

SpringBoot應急知識學習系統開發實現

概述 一個基于SpringBoot開發的應急知識學習系統&#xff0c;該系統提供了完整的用戶注冊、登錄、知識學習與測評功能。對于開發者而言&#xff0c;這是一個值得參考的免費Java源碼項目&#xff0c;可以幫助您快速構建類似的教育平臺。 主要內容 5.2 注冊模塊的實現 系統采…

【Python 字符串】

Python 中的字符串&#xff08;str&#xff09;是用于處理文本數據的基礎類型&#xff0c;具有不可變性、豐富的內置方法和靈活的操作方式。以下是 Python 字符串的核心知識點&#xff1a; 一、基礎特性 定義方式&#xff1a; s1 單引號字符串 s2 "雙引號字符串" s…

第十六屆藍橋杯大賽軟件賽C/C++大學B組部分題解

第十六屆藍橋杯大賽軟件賽C/C大學B組題解 試題A: 移動距離 問題描述 小明初始在二維平面的原點&#xff0c;他想前往坐標(233,666)。在移動過程中&#xff0c;他只能采用以下兩種移動方式&#xff0c;并且這兩種移動方式可以交替、不限次數地使用&#xff1a; 水平向右移動…

如何使用極狐GitLab 軟件包倉庫功能托管 npm?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 軟件包庫中的 npm 包 (BASIC ALL) npm 是 JavaScript 和 Node.js 的默認包管理器。開發者使用 npm 共享和重用代碼&#xff…

Matlab 基于Hough變換的人眼虹膜定位方法

1、內容簡介 Matlab220-基于Hough變換的人眼虹膜定位方法 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

chili調試筆記14 畫線 頁面布置 線條導出dxf

2025-05-08 09-05-06 llm畫線 頁面布置 expand有自己的格式 刪了就會按照子元素格式 不加px無效 沒有指定尺寸設置100%無效 怎么把線條導出dxf command({name: "file.export",display: "command.export",icon: "icon-export", }) export class…

藍綠發布與金絲雀發布

藍綠發布與金絲雀發布 一、藍綠發布&#xff1a;像「搬家」一樣安全上線1. 生活化故事2. 技術步驟拆解步驟①&#xff1a;初始狀態步驟②&#xff1a;部署新版本到綠環境步驟③&#xff1a;內部驗證綠環境步驟④&#xff1a;一鍵切換流量步驟⑤&#xff1a;監控與回滾 3. 藍綠發…

【2025五一數學建模競賽B題】 礦山數據處理問題|建模過程+完整代碼論文全解全析

你是否在尋找數學建模比賽的突破點&#xff1f;數學建模進階思路&#xff01; 作為經驗豐富的美賽O獎、國賽國一的數學建模團隊&#xff0c;我們將為你帶來本次數學建模競賽的全面解析。這個解決方案包不僅包括完整的代碼實現&#xff0c;還有詳盡的建模過程和解析&#xff0c…

JavaSE核心知識點02面向對象編程02-02(封裝、繼承、多態)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點02面向對象編程02-02&#…