Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产拍拍视频,中文字幕在线最新在线不卡,欧美在线高清

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          看看瀏覽器如何解析我們寫的頁面?

          述:瀏覽器渲染一共有五步

          • 處理 HTML 并構建 DOM 樹。
          • 處理 CSS 構建 CSSOM 樹。
          • 將 DOM 與 CSSOM 合并成一個渲染樹。
          • 根據渲染樹來布局,計算每個節點的位置。
          • 調用 GPU 繪制,合成圖層,顯示在屏幕上

          具體如下圖過程如下圖所示

          • 在構建 CSSOM 樹時,會阻塞渲染,直至 CSSOM 樹構建完成。并且構建 CSSOM 樹是一個十分消耗性能的過程,所以應該盡量保證層級扁平,減少過度層疊,越是具體的 CSS 選擇器,執行速度越慢
          • 當 HTML 解析到 script 標簽時,會暫停構建 DOM ,完成后才會從暫停的地方重新開始。也就是說,如果你想首屏渲染的越快,就越不應該在首屏就加載 JS 文件。并且 CSS 也會影響 JS 的執行,只有當解析完樣式表才會執行 JS ,所以也可以認為這種情況下, CSS 也會暫停構建 DOM

          二、瀏覽器渲染五個階段

          2.1 第一步:解析HTML標簽,構建DOM樹

          在這個階段,引擎開始解析 html ,解析出來的結果會成為一棵 dom 樹

          dom 的目的至少有 2 個

          getElementById
          

          當解析器到達script標簽的時候,發生下面四件事情

          1. html 解析器停止解析,
          2. 如果是外部腳本,就從外部網絡獲取腳本代碼
          3. 將控制權交給 js 引擎,執行 js 代碼
          4. 恢復 html 解析器的控制權

          由此可以得到第一個結論1

          • 由于 <script> 標簽是阻塞解析的,將腳本放在網頁尾部會加速代碼渲染。
          • defer 和 async 屬性也能有助于加載外部腳本。
          • defer 使得腳本會在 dom 完整構建之后執行;
          • async 標簽使得腳本只有在完全 available 才執行,并且是以非阻塞的方式進行的

          2.2 第二步:解析CSS標簽,構建CSSOM樹

          • 我們已經看到 html 解析器碰到腳本后會做的事情,接下來我們看下 html 解析器碰到樣式表會發生的情況
          • js 會阻塞解析,因為它會修改文檔( document )。 css 不會修改文檔的結構,如果這樣的話,似乎看起來 css 樣式不會阻塞瀏覽器 html 解析。但是事實上 css 樣式表是阻塞的。阻塞是指當 cssom 樹建立好之后才會進行下一步的解析渲染

          通過以下手段可以減輕cssom帶來的影響

          • 將 script 腳本放在頁面底部
          • 盡可能快的加載 css 樣式表
          • 將樣式表按照 media type 和 media query 區分,這樣有助于我們將 css 資源標記成非阻塞渲染的資源。
          • 非阻塞的資源還是會被瀏覽器下載,只是優先級較低

          2.3 第三步:把DOM和CSSOM組合成渲染樹(render tree)

          2.4 第四步:在渲染樹的基礎上進行布局,計算每個節點的幾何結構

          布局( layout ):定位坐標和大小,是否換行,各種 position , overflow , z-index 屬性

          2.5 調用 GPU 繪制,合成圖層,顯示在屏幕上

          將渲染樹的各個節點繪制到屏幕上,這一步被稱為繪制 painting

          三、渲染優化相關

          3.1 Load 和 DOMContentLoaded 區別

          • Load 事件觸發代表頁面中的 DOM , CSS , JS ,圖片已經全部加載完畢。
          • DOMContentLoaded 事件觸發代表初始的 HTML 被完全加載和解析,不需要等待 CSS , JS ,圖片加載

          3.2 圖層

          一般來說,可以把普通文檔流看成一個圖層。特定的屬性可以生成一個新的圖層。不同的圖層渲染互不影響,所以對于某些頻繁需要渲染的建議單獨生成一個新圖層,提高性能。但也不能生成過多的圖層,會引起反作用。

          通過以下幾個常用屬性可以生成新圖層

          • 3D 變換: translate3d 、 translateZ
          • will-change
          • video 、 iframe 標簽
          • 通過動畫實現的 opacity 動畫轉換
          • position: fixed

          3.3 重繪(Repaint)和回流(Reflow)

          重繪和回流是渲染步驟中的一小節,但是這兩個步驟對于性能影響很大

          color
          

          回流必定會發生重繪,重繪不一定會引發回流。回流所需的成本比重繪高的多,改變深層次的節點很可能導致父節點的一系列回流

          以下幾個動作可能會導致性能問題

          window
          

          很多人不知道的是,重繪和回流其實和 Event loop 有關

          • 當 Event loop 執行完 Microtasks 后,會判斷 document 是否需要更新。因為瀏覽器是 60Hz 的刷新率,每 16ms 才會更新一次。
          • 然后判斷是否有 resize 或者 scroll ,有的話會去觸發事件,所以 resize 和 scroll 事件也是至少 16ms 才會觸發一次,并且自帶節流功能。
          • 判斷是否觸發了 media query
          • 更新動畫并且發送事件
          • 判斷是否有全屏操作事件
          • 執行 requestAnimationFrame 回調
          • 執行 IntersectionObserver 回調,該方法用于判斷元素是否可見,可以用于懶加載上,但是兼容性不好
          • 更新界面
          • 以上就是一幀中可能會做的事情。如果在一幀中有空閑時間,就會去執行 requestIdleCallback 回調

          3.4 減少重繪和回流

          使用 translate 替代 top

          • 使用 visibility 替換 display: none ,因為前者只會引起重繪,后者會引發回流(改變了布局)
          • 把 DOM 離線后修改,比如:先把 DOM 給 display:none (有一次 Reflow) ,然后你修改 100 次,然后再把它顯示出來
          • 不要把 DOM 結點的屬性值放在一個循環里當成循環里的變量
          for(let i = 0; i < 1000; i++) {
           // 獲取 offsetTop 會導致回流,因為需要去獲取正確的值
           console.log(document.querySelector('.test').style.offsetTop)
          }
          
          • 不要使用 table 布局,可能很小的一個小改動會造成整個 table 的重新布局
          • 動畫實現的速度的選擇,動畫速度越快,回流次數越多,也可以選擇使用 requestAnimationFrame
          • CSS 選擇符從右往左匹配查找,避免 DOM 深度過深
          • 將頻繁運行的動畫變為圖層,圖層能夠阻止該節點回流影響別的元素。比如對于 video 標簽,瀏覽器會自動將該節點變為圖層。

          要:在本文中,將重點關注網頁的初始渲染,即它從解析 HTML 開始。 我將探索可能導致高渲染時間的問題,以及如何解決它們。

          本文分享自華為云社區《頁面首屏渲染性能指南-云社區-華為云》,作者:Ocean2022。

          我們知道渲染頁面是一個將服務器的響應內容翻譯成圖片的過程。但是,如果你頁面的渲染性能比較糟糕的話,可能會帶來相對較高的跳出率。

          在本文中,我將重點關注網頁的初始渲染,即它從解析 HTML 開始。 我將探索可能導致高渲染時間的問題以及如何解決它們。

          關鍵渲染路徑(CRP)

          關鍵渲染路徑 (CRP) 是瀏覽器將代碼轉換為屏幕上可顯示像素的過程。 它有幾個階段,其中一些可以并行執行以節省時間,但有些部分必須依次完成。 如下圖所示:

          首先,一旦瀏覽器得到響應,它就會開始解析它。 當它遇到依賴項時,它會嘗試下載它。 如果它是一個樣式表文件,瀏覽器必須在渲染頁面之前完全解析它,這就是為什么 CSS 會阻塞渲染的原因。

          如果是腳本,瀏覽器必須:停止解析,下載腳本,然后運行。 只有在那之后它才能繼續解析,因為 JavaScript 程序可以改變網頁的內容(尤其是 HTML)。 這就是為什么 JS 會阻塞解析的原因。

          完成所有解析后,瀏覽器將構建文檔對象模型 (DOM) 和級聯樣式表對象模型 (CSSOM)。 將它們組合在一起得到渲染樹。 頁面的不顯示部分不會進入渲染樹,因為它只包含繪制頁面所需的數據。

          倒數第二步是將渲染樹進行布局, 這個階段也稱為回流:就是計算每個渲染樹節點的每個位置及其大小的地方。

          最后一步是繪制。 它會根據瀏覽器在前一階段計算得到的數據對像素進行著色。

          優化相關結論

          因此,根據這一過程,我們在優化性能方面,得出了一些結論。如果你要提升頁面初始化渲染的性能,你需要:

          • 減少傳輸的數據量
          • 減少瀏覽器必須下載的資源數量(尤其是阻塞的資源)
          • 減小 CRP 的長度

          同時,我們會根據下面 3 個指標來衡量優化的效率:

          • FP(First Paint)
          • FCP(First Contentful Paint)
          • FMP(First Meaningful Paint)

          除了渲染時間之外,還有其他一些因素也需要考慮。例如,你的頁面使用了多少阻塞資源以及下載它們需要多長時間

          性能優化策略

          鑒于我們在上面得出的結論,我們得出網站性能優化有三種主要策略:

          1. 盡量減少通過網絡傳輸的數據量;
          2. 減少通過網絡傳輸的資源總數;
          3. 縮短關鍵渲染路徑;

          1. 減少要傳輸的數據量

          首先,移除所有未使用的部分,例如 JavaScript 中無法訪問的函數、帶有從不匹配任何元素的選擇器的樣式以及被 CSS 永遠隱藏的 HTML 標簽。 其次,刪除所有重復項。

          然后,我建議建立一個自動壓縮過程。 例如,它應該從你的后端服務中刪除所有注釋(但不是源代碼)以及每個不包含附加信息的字符(例如 JS 中的空白字符)。

          完成后,我們剩下的可以是文本字符串。 這意味著我們可以安全地應用諸如 GZIP(大多數瀏覽器都理解)之類的壓縮算法。

          最后,還有緩存。 瀏覽器第一次呈現頁面時它不會有幫助,但它會在以后的訪問中節省很多。 但是,記住兩點至關重要:

          • 如果你使用 CDN,請確保支持緩存并在正確設置。
          • 與其等待資源的到期,不如 將文件的“指紋”嵌入到其 URL 中,以使本地緩存無效。

          當然,應該為每個資源定義緩存策略。 有些可能很少改變或根本不會改變,有的則是變化的很快,還有些文件包含敏感的信息(可以使用 “private” 防止 CDN 緩存私有數據)

          2. 減少關鍵資源的總數

          “關鍵”僅指網頁正確呈現所需的資源。 因此,我們可以直接跳過所有流程中沒有涉及的樣式以及腳本文件。

          樣式

          為了告訴瀏覽器不需要特定的 CSS 文件,我們應該為所有引用樣式表的鏈接設置媒體屬性。 使用這種方法,瀏覽器將只根據需要處理與當前媒體(設備類型、屏幕尺寸)匹配的資源同時降低所有其他樣式表的優先級。 例如,如果你將 media=“print” 屬性添加到引用樣式以打印頁面的樣式標記,則這些樣式不會在不打印媒體時干擾你的關鍵渲染路徑

          為了進一步改進該過程,你還可以將一些樣式內聯這可以為我們節省了至少一次到服務器的往返行程

          腳本

          如上所述,腳本會阻塞解析,因為它們可以改變 DOM 和 CSSOM。 為了避免這一點,所有腳本標簽都必須用屬性標記——異步或延遲。

          標有 async 的腳本不會阻塞 DOM 構建或 CSSOM,因為它們可以在 CSSOM 構建之前執行。 但請記住,內聯腳本無論如何都會阻止 CSSOM,除非你將它們放在 CSS 之上。

          相比之下,標有 defer 的腳本將在頁面加載結束時進行執行

          換句話說,使用 defer,腳本直到頁面加載事件被觸發后才會執行,而 async 讓腳本在文檔被解析時就會在后臺運行。

          3.縮短關鍵渲染路徑長度

          最后,應將 CRP 長度縮短到可能的最小值。

          作為樣式標簽屬性的媒體查詢將減少必須下載的資源總數。 script 標簽屬性 defer 和 async 將防止相應的腳本阻塞解析。

          使用 GZIP 壓縮、壓縮和歸檔資源將減少傳輸數據的大小(從而也減少數據傳輸時間)。

          內聯一些樣式和腳本也可以減少瀏覽器和服務器之間的往返次數。

          按照最新的最佳性能實踐理念,一個網站應該做的最快的第一件事就是展示 ATF 內容。 ATF 代表首屏這是立即可見的區域,無需滾動。 因此,最好以首先加載所需樣式和腳本的方式重新排列與渲染相關的所有內容,而其他所有內容都停止(既不解析也不渲染)。

          結尾

          總而言之,網站性能優化包含了網站響應的各個方面,例如緩存、設置 CDN、重構、資源優化等,但是所有這些都可以逐步完成。 作為 Web 開發人員,你可以將本文作為參考,并始終記住在實驗之前和之后測量性能。

          瀏覽器開發人員盡最大努力優化你訪問的每個頁面的網站性能,這就是瀏覽器通常實現所謂的“預加載器”的原因。 這部分程序會在你以 HTML 格式請求的資源之前進行掃描,以便一次發出多個請求并讓它們并行運行。 這就是為什么在 HTML(逐行)以及腳本標簽中保持樣式標簽彼此靠近的原因。

          此外,嘗試批量更新 HTML 以避免多個布局事件這些事件不僅由 DOM 或 CSSOM 中的更改觸發,而且在設備方向更改和窗口大小調整時也會觸發。

          點擊下方,第一時間了解華為云新鮮技術~

          華為云博客_大數據博客_AI博客_云計算博客_開發者中心-華為云

          覽器解析HTML文件的過程是網頁呈現的關鍵步驟之一。具體介紹如下:


          HTML文檔的接收和預處理

          1. 網絡請求處理:當用戶輸入URL或點擊鏈接時,瀏覽器發起HTTP請求,服務器響應并返回HTML文件。此過程中,瀏覽器需要處理DNS查詢、建立TCP連接等底層網絡通信操作。
          2. 預解析優化:為了提高性能,現代瀏覽器在主線程解析HTML之前會啟動一個預解析線程,提前下載HTML中鏈接的外部CSS和JS文件。這一步驟確保了后續渲染過程的順暢進行。

          解析為DOM樹

          1. 詞法分析和句法分析:瀏覽器的HTML解析器通過詞法分析將HTML文本標記轉化為符號序列,然后通過句法分析器按照HTML規范構建出DOM樹。每個節點代表一個HTML元素,形成了多層次的樹狀結構。
          2. 生成對象接口:生成的DOM樹是頁面元素的結構化表示,提供了操作頁面元素的接口,如JavaScript可以通過DOM API來動態修改頁面內容和結構。

          CSS解析與CSSOM樹構建

          1. CSS文件加載與解析:瀏覽器解析HTML文件中的<link>標簽引入的外部CSS文件和<style>標簽中的內聯CSS,生成CSSOM樹。CSSOM樹反映了CSS樣式的層級和繼承關系。
          2. CSS屬性計算:包括層疊、繼承等,確保每個元素對應的樣式能夠被準確計算。這些計算過程為后續的布局提供必要的樣式信息。

          JavaScript加載與執行

          1. 阻塞式加載:當解析器遇到<script>標簽時,它會停止HTML的解析,轉而先加載并執行JavaScript代碼。這是因為JS可能會修改DOM結構或CSSOM樹,從而影響已解析的部分。
          2. 異步和延遲加載:為了不影響頁面的初步渲染,可以采用async或defer屬性來異步加載JS文件,這樣可以在后臺進行JS的加載和執行,而不阻塞HTML解析。

          渲染樹的構建

          1. 合并DOM樹和CSSOM樹:有了DOM樹和CSSOM樹后,瀏覽器將它們組合成渲染樹,這個樹只包含顯示界面所需的DOM節點及對應的樣式信息。
          2. 不可見元素的排除:渲染樹會忽略例如<head>、<meta>等不可見元素,只關注<body>內的可視化內容。

          布局計算(Layout)

          1. 元素位置和尺寸確定:瀏覽器從渲染樹根節點開始,遞歸地計算每個節點的精確位置和尺寸,這個過程也被稱為“回流”或“重排”,是后續繪制的基礎。
          2. 布局過程的優化:現代瀏覽器會盡量優化布局過程,例如通過流式布局的方式減少重復計算,確保高效地完成布局任務。

          繪制(Paint)

          1. 像素級繪制:繪制是一個將布局計算后的各元素繪制成像素點的過程。這包括文本、顏色、邊框、陰影以及替換元素的繪制。
          2. 層次化的繪制:為了高效地更新局部內容,瀏覽器會將頁面分成若干層次(Layer),對每一層分別進行繪制,這樣只需更新變化的部分。

          因此,我們開發中要注意以下幾點:

          • 避免過度使用全局腳本:盡量減少使用全局腳本或者將它們放在文檔底部,以減少對HTML解析的阻塞。
          • 合理組織CSS和使用CSS預處理器:合理組織CSS文件的結構和覆蓋規則,利用CSS預處理器進行模塊化管理。
          • 利用瀏覽器緩存機制:通過設置合理的緩存策略,減少重復加載相同資源,提升二次訪問的體驗。
          • 優化圖片和多媒體資源:適當壓縮圖片和優化多媒體資源的加載,減少網絡傳輸時間和渲染負擔。

          綜上所述,瀏覽器解析HTML文件是一個復雜而高度優化的過程,涉及從網絡獲取HTML文檔到最終將其渲染到屏幕上的多個步驟。開發者需要深入理解這些步驟,以優化網頁性能和用戶體驗。通過合理組織HTML結構、優化資源加載順序、減少不必要的DOM操作和合理安排CSS和JavaScript的加載與執行,可以顯著提升頁面加載速度和運行效率。


          主站蜘蛛池模板: 国产色精品vr一区区三区| 精品福利一区二区三区免费视频 | 2018高清国产一区二区三区| 精品少妇一区二区三区在线| 国模无码一区二区三区不卡| 另类一区二区三区| 无码人妻精品一区二区三| 日韩毛片基地一区二区三区| 精品国产一区在线观看| 亚洲A∨精品一区二区三区| 国产日韩高清一区二区三区| 精品人妻中文av一区二区三区| 亚洲AV无码一区二区乱子仑| 亚洲一区无码精品色| 久久久久人妻一区二区三区| 成人毛片无码一区二区| 中文字幕一区二区在线播放 | 亚洲熟女综合一区二区三区| 日韩精品无码一区二区三区AV| 色综合视频一区二区三区 | 亚洲国产av一区二区三区| 日本一道高清一区二区三区| 欧美日韩精品一区二区在线观看 | 四虎精品亚洲一区二区三区| 国产一区二区在线观看视频 | 亚洲一区中文字幕在线观看| 精品欧洲av无码一区二区| 一区二区三区国产精品| 青青青国产精品一区二区| 精品视频一区二区三三区四区| 91午夜精品亚洲一区二区三区| 日韩精品无码一区二区中文字幕| 亚洲av无码一区二区三区乱子伦| 亚洲色精品aⅴ一区区三区| 中文字幕人妻丝袜乱一区三区 | 国产一区二区三区免费在线观看| 日本视频一区二区三区 | 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲欧洲精品一区二区三区| 曰韩人妻无码一区二区三区综合部| 国产精品av一区二区三区不卡蜜|