主頁 > 企業開發 > 瀏覽器渲染和原理

瀏覽器渲染和原理

2022-10-31 08:40:08 企業開發

一、瀏覽器的渲染程序

  • 注意:這個程序是逐步完成的,為了更好的用戶體驗,渲染引擎將會盡可能早的將內容呈現到螢屏上,并不會等到所有的html 都決議完成之后再去構建和布局 render 樹,它是決議完一部分內容就顯示一部分內容,同時,可能還在通過網路下載其余內容,

  • 渲染程序解讀如下

    • 首先決議收到的檔案,根據檔案定義構建一棵 DOM 樹,DOM 樹是由 DOM 元素及屬性節點組成的,
    • 然后對 CSS 進行決議,生成 CSSOM 規則樹,
    • 根據 DOM 樹和 CSSOM 規則樹構建渲染樹,渲染樹的節點被稱為渲染物件,渲染物件是一個包含有顏色和大小等屬性的矩形,渲染物件和 DOM 元素相對應,但這種對應關系不是一對一的,不可見的 DOM 元素不會被插入渲染樹,還有一些 DOM元素對應幾個可見物件,它們一般是一些具有復雜結構的元素,無法用一個矩形來描述,
    • 當渲染物件被創建并添加到樹中,它們并沒有位置和大小,所以當瀏覽器生成渲染樹以后,就會根據渲染樹來進行布局(也可以叫做回流),這一階段瀏覽器要做的事情是要弄清楚各個節點在頁面中的確切位置和大小,通常這一行為也被稱為“自動重排”,
    • 布局階段結束后是繪制階段,遍歷渲染樹并呼叫渲染物件的 paint 方法將它們的內容顯示在螢屏上,繪制使用 UI 基礎組件,

二、瀏覽器渲染優化

1.針對JavaScript

  • JavaScript既會阻塞HTML的決議,也會阻塞CSS的決議,因此我們可以對JavaScript的加載方式進行改變,來進行優化
    • 盡量將JavaScript檔案放在body的最后
    • <scipt>標簽的引入資源方式有三種,有一種就是我們常用的直接引入,還有兩種就是使用 async 屬性和 defer 屬性來異步引入,兩者都是去異步加載外部的JS檔案,不會阻塞DOM的決議(盡量使用異步加載),三者的區別如下:
      • script 立即停止頁面渲染去加載資源檔案,當資源加載完畢后立即執行js代碼,js代碼執行完畢后繼續渲染頁面
      • async 是在下載完成之后,立即異步加載,加載好后立即執行,多個帶async屬性的標簽,不能保證加載的順序
      • defer 是在下載完成之后,立即異步加載,加載好后,如果 DOM 樹還沒構建好,則先等 DOM 樹決議好再執行;如果DOM樹已經準備好,則立即執行,多個帶defer屬性的標簽,按照順序執行

2.針對CSS

  • 使用CSS有三種方式:使用link、@import、行內樣式,其中link和@import都是匯入外部樣式,它們之間的區別:
    • link:瀏覽器會派發一個新的執行緒(HTTP執行緒)去加載資源檔案,與此同時GUI渲染執行緒會繼續向下渲染代碼
    • @import:GUI渲染執行緒會暫時停止渲染,去服務器加載資源檔案,資源檔案沒有回傳之前不會繼續渲染(阻礙瀏覽器渲染)
    • style:GUI直接渲染
    • 所以,在開發程序中,匯入外部樣式使用link,而不用@import,如果css少,盡可能采用內嵌樣式,直接寫在style標簽中,
  • 外部樣式如果長時間沒有加載完畢,瀏覽器為了用戶體驗,會使用瀏覽器會默認樣式,確保首次渲染的速度,所以CSS一般寫在headr中,讓瀏覽器盡快發送請求去獲取css樣式

3.針對DOM樹、CSSOM規則樹

  • HTML檔案的代碼層級盡量不要太深
  • 使用語意化的標簽,來避免不標準語意化的特殊處理
  • 減少CSS代碼的層級,因為選擇器是從右向左進行決議的

4.減少回流與重繪

  • 瀏覽器針對頁面的回流與重繪,進行了自身的優化——渲染佇列,瀏覽器會將所有的回流、重繪的操作放在一個佇列中,當佇列中的操作到了一定的數量或者到了一定的時間間隔,瀏覽器就會對佇列進行批量處理,這樣就會讓多次的回流、重繪變成一次回流重繪,
  • CSS
    • 避免設定多層行內樣式
    • 如果需要設定影片效果,最好使用absolute或者fixed,使元素脫離檔案流,這樣他們發生變化就不會影響其他元素
    • 避免使用CSS運算式(例如:calc())
  • JS
    • 避免頻繁操作樣式,最好將樣式串列定義為class并一次性更改class屬性
    • 避免頻繁操作DOM,創建一個documentFragment,在它上面應用所有DOM操作,最后再把它添加到檔案中
    • 可以先為元素設定為不可見:display: none,操作結束后再把它顯示出來,因為在display屬性為none的元素上進行的DOM操作不會引發回流和重繪

三、渲染程序中遇到 JS 檔案如何處理

  • JavaScript 的加載、決議與執行會阻塞檔案的決議,也就是說,在構建 DOM 時,HTML 決議器若遇到了 JavaScript,那么它會暫停檔案的決議,將控制權移交給 JavaScript 引擎,等 JavaScript 引擎運行完畢,瀏覽器再從中斷的地方恢復繼續決議檔案,也就是說,如果想要首屏渲染的越快,就越不應該在首屏就加載 JS 檔案,這也是都建議將 script 標簽放在 body 標簽底部的原因,當然在當下,并不是說 script 標簽必須放在底部,因為你可以給 script 標簽添加 defer 或者 async 屬性

四、檔案的預決議

  • Webkit 和 Firefox 都做了這個優化,當執行 JavaScript 腳本時,另一個執行緒決議剩下的檔案,并加載后面需要通過網路加載的資源,這種方式可以使資源并行加載從而使整體速度更快,需要注意的是,預決議并不改變 DOM 樹,它將這個作業留給主決議程序,自己只決議外部資源的參考,比如外部腳本、樣式表及圖片,

五、CSS 如何阻塞檔案決議

  • 理論上,既然樣式表不改變 DOM 樹,也就沒有必要停下檔案的決議等待它們,然而,存在一個問題,JavaScript 腳本執行時可能在檔案的決議程序中請求樣式資訊,如果樣式還沒有加載和決議,腳本將得到錯誤的值,顯然這將會導致很多問題,所以如果瀏覽器尚未完成 CSSOM 的下載和構建,而我們卻想在此時運行腳本,那么瀏覽器將延遲 JavaScript 腳本執行和檔案的決議,直至其完成 CSSOM 的下載和構建,也就是說,在這種情況下,瀏覽器會先下載和構建 CSSOM,然后再執行 JavaScript,最后再繼續檔案的決議

六、優化關鍵渲染路徑

  • 優化方法如下
    • 對關鍵路徑進行分析和特性描述:資源數、位元組數、長度
    • 最大限度減少關鍵資源的數量:洗掉它們,延遲它們的下載,將它們標記為異步等
    • 優化關鍵位元組數以縮短下載時間(往返次數)
    • 優化其余關鍵資源的加載順序:您需要盡早下載所有關鍵資產,以縮短關鍵路徑長度

七、阻塞渲染的情況

  • 首先渲染的前提是生成渲染樹,所以 HTML 和 CSS 肯定會阻塞渲染,如果你想渲染的越快,你越應該降低一開始需要渲染的檔案大小,并且扁平層級,優化選擇器,然后當瀏覽器在決議到 script 標簽時,會暫停構建 DOM,完成后才會從暫停的地方重新開始,也就是說,如果你想首屏渲染的越快,就越不應該在首屏就加載 JS 檔案,這也是都建議將 script 標簽放在 body 標簽底部的原因,當然在當下,并不是說 script 標簽必須放在底部,因為你可以給 script 標簽添加 defer 或者 async 屬性,當 script 標簽加上 defer 屬性以后,表示該 JS 檔案會并行下載,但是會放到 HTML 決議完成后順序執行,所以對于這種情況你可以把 script 標簽放在任意位置,對于沒有任何依賴的 JS 檔案可以加上 async 屬性,表示 JS 檔案下載和決議不會阻塞渲染,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523209.html

標籤:其他

上一篇:JavaScript 使用 Notification 發送系統通知

下一篇:轉載:HTML代碼簡寫法:Emmet和Haml

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more