10分鐘看懂瀏覽器的渲染過程及優化

一、瀏覽器概述

??目前的主流瀏覽器有5個:Internet Explorer、Firefox、Safari、Chrome和Opera瀏覽器。根據 StatCounter 瀏覽器統計數據,目前(截止2019 年 5 月)Firefox、Safari 和 Chrome 瀏覽器的總市場占有率將近 83.66%。由此可見,如今開放源代碼瀏覽器在瀏覽器市場中占據了非常堅實的部分。
??以上5種瀏覽器由于有著不同的瀏覽器內核,造成同樣的html頁面有著不同呈現。Internet Explorer的內核是Trident;Firefox的內核是Gecko;Chrome、Safari內核是Webkit;Opera的內核則是Presto。

二、瀏覽器渲染過程

??我們先大致看下瀏覽器渲染關鍵路徑圖:

1、HTML解析,構建DOM樹

??瀏覽器從網絡或硬盤中獲得HTML字節數據后會經過以下流程將字節解析為DOM樹

  • 字符編碼:先將HTML的原始字節數據轉換為文件指定編碼的字符。
  • 令牌化:然后瀏覽器會根據HTML規范來將字符串轉換成各種令牌(如<html><body><p>這樣的標簽以及標簽中的字符串和屬性等都會被轉化為令牌,每個令牌具有特殊含義和規則)。
  • 生成節點對象:接著每個令牌都會被轉換成定義其屬性和規則的對象,即節點對象。
  • 構建DOM樹:最后將節點對象構建成樹形結構,即DOM樹。HTML標簽之間有復雜的父子關系,樹形結構剛好可以詮釋這樣的關系。

??下面通過一段HTML代碼與配圖更好的理解“字節 -> 字符 -> 令牌-> 節點對象 -> 對象模型”這個過程:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"><title>Critical Path</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="test.png"></div></body>
</html>
復制代碼

DOM樹構建過程

2、CSS解析,構建CSSOM樹

??瀏覽器解析遇到<link>標簽時,瀏覽器就開始解析CSS,像構建DOM樹一樣構建CSSOM樹。style.css的代碼如下:

body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }
復制代碼

CSSOM樹

3、Render Tree

??在構建了DOM樹CSSOM樹之后,瀏覽器只是擁有2個相互獨立的對象集合,DOM樹描述的文檔結構和內容,CSSOM樹描述了對應文檔的樣式規則,想要渲染出頁面,就需要將DOM樹CSSOM樹結合在一起,構建渲染樹。

渲染樹

4、Layout

??渲染樹構建好后,瀏覽器得到了每個節點的內容與樣式,下一步就是需要計算每個節點在瀏覽器窗口的確切位置與大小,即layout布局。
??布局階段,從渲染樹的根節點開始遍歷,采用盒子模型的模式來表示每個節點與其他元素之間的距離,從而確定每個元素在屏幕內的位置與大小。

盒子模型:包括外邊距(margin),內邊距(padding),邊框(border),內容(content)。標準盒子模型width/height = content;IE盒子模型width/height = content + padding + border。

盒子模型

5、Paint繪制頁面

??當Layout布局完成后,瀏覽器會立即發出Paint事件,開始講渲染樹繪制成像素,繪制所需要的時間跟CSS樣式的復雜度成正比,繪制完成后,用戶才能看到頁面在屏幕中的最終呈現效果。

??如果想更詳細地體驗瀏覽器渲染流程,可以使用Chrome開發者工具中的Performance面板,錄制瀏覽器從請求直到渲染完成的過程,如下圖所示:

Performance

三、渲染優化方案

1、優化渲染關鍵路徑方案

??通過優化渲染關鍵路徑,可以優化頁面渲染性能,減少頁面白屏時間。

  • 優化JSJavaScript文件加載會阻塞DOM樹的構建,可以給<script>標簽添加異步屬性async,這樣瀏覽器的HTML解析就不會被js文件阻塞。
  • 優化CSS:瀏覽器每次遇到<link>標簽時,瀏覽器就需要向服務器發出請求獲得CSS文件,然后才繼續構建DOM樹CSSOM樹,可以合并所有CSS成一個文件,減少HTTP請求,減少關鍵資源往返加載的時間,優化渲染速度。

2、其他優化方案

  • 加載部分HTML
    瀏覽器先加載主要HTML初始化靜態部分,動態變化的HTML內容通過Ajax請求加載。這樣可以減少瀏覽器構建DOM樹的工作量,讓用戶感覺頁面加載速度很快。
  • 壓縮
    對HTML、CSS、JavaScript這些文件去除冗余字符(例如不必要的注釋、空格符和換行符等),再進行壓縮,減小文件數據大小,加快瀏覽器解析文件編碼。
  • 圖片加載優化
    1)小圖標合并成雪碧圖,進而減少img的HTTP請求次數;
    2)圖片加載較多時,采用懶加載的方案,用戶滾動頁面可視區時再加載渲染圖片。
  • HTTP緩存
    瀏覽器自帶了HTTP緩存的功能,只需要確保每個服務器響應的頭部都包含了以下的屬性:
    1)ETag: ETag是一個傳遞驗證令牌,它對資源的更新進行檢查,如果資源未發生變化時不會傳送任何數據。當瀏覽器發送一個請求時,會把ETag一起發送到服務器,服務器會根據當前資源核對令牌(ETag通常是對內容進行Hash后得出的一個指紋),如果資源未發生變化,服務器將返回304 Not Modified響應,這時瀏覽器不必再次下載資源,而是繼續復用緩存。
    2)Cache-Control: Cache-Control定義了緩存的策略,它規定在什么條件下可以緩存響應以及可以緩存多久。
    a、no-cache: no-cache表示必須先與服務器確認返回的響應是否發生了變化,然后才能使用該響應來滿足后續對同一網址的請求(每次都會根據ETag對服務器發送請求來確認變化,如果未發生變化,瀏覽器不會下載資源)。no-store直接禁止瀏覽器以及所有中間緩存存儲任何版本的返回響應。簡單的說,該策略會禁止任何緩存,每次發送請求時,都會完整地下載服務器的響應。
    b、public&private: 如果響應被標記為public,則即使它有關聯的HTTP身份驗證,甚至響應狀態代碼通常無法緩存,瀏覽器也可以緩存響應。如果響應被標記為private,那么這個響應通常只為單個用戶緩存,因此不允許任何中間緩存(CDN)對其進行緩存,private一般用在緩存用戶私人信息頁面。
    c、max-age: max-age定義了從請求時間開始,緩存的最長時間,單位為秒。

小結

??今天瀏覽器渲染過程和優化方案就介紹到這里,大家如果有更多更好的頁面性能優化方案可以多多交流,評論區歡迎留言~~

轉載于:https://juejin.im/post/5d136700f265da1b7c6128db

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

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

相關文章

淺談 Vue 項目優化

前幾天看到大家說 vue 項目越大越難優化&#xff0c;帶來很多痛苦&#xff0c;這是避免不了的&#xff0c;問題終究要解決&#xff0c;框架的性能是沒有問題的&#xff0c;各大測試網站都有相關數據。下面進入正題 基礎優化 所謂的基礎優化是任何 web 項目都要做的&#xff0c;…

uni-app微信小程序一鍵登錄獲取權限功能

<button class"bottom size_30" type"primary" lang"zh_CN" click"getUserInfo">一鍵登錄</button>//第一授權獲取用戶信息》按鈕觸發getUserInfo() {// 展示加載框uni.showLoading({title: 加載中,});uni.getUserProfile…

第九章 結構體與共用體

姓名&#xff1a;呂家浩 實驗地點&#xff1a;教學樓514教室 實驗時間&#xff1a;4月30日 一、本章要點 1.通過實驗理解結構體和共用體的數據結構2.結構體、共用體中數組的使用及變量的賦值3.結構體和共用體定義時的嵌套使用&#xff08;嵌套使用的結構體必須先定義&…

H5-localStorage數據存儲總結

一、什么是localStorage、sessionStorage 在HTML5中&#xff0c;新加入了一個localStorage特性&#xff0c;這個特性主要是用來作為本地存儲來使用的&#xff0c;解決了cookie存儲空間不足的問題(cookie中每條cookie的存儲空間為4k)&#xff0c;localStorage中一般瀏覽器支持的…

正則校驗與時間格式化

// 日期回顯 export function formatTime(data&#xff0c;fametYYYY-MM-DD HH:MMM:SS) {if(famet YYYY-MM-DD HH:MMM:SS){const time new Date(data)const year time.getFullYear()const month time.getMonth() 1const day time.getDate()const hour time.getHours()co…

CometOJ#6 雙倍快樂(簡單DP)

鏈接&#xff1a;https://www.cometoj.com/contest/48/problem/B 題意&#xff1a;給出一串數列&#xff0c;要求在這個數列中找出兩條“不相交”的非下降子序列使得子序列之和最大。“不相交”即不存在任意的ai同時存在于兩個子序列中。 分析&#xff1a;筆者刷題量不多&#…

iOS開發-證書問題精析~

在iOS開發過程中&#xff0c;不可避免的要和證書打交道&#xff0c;真機調試、App上架、打包給測試去測試等都需要搞證書。在此過程中我們會遇到很多的問題&#xff0c;但是如果掌握了真機調試的原理和本質&#xff1b;遇到問題&#xff0c;我們就更容易定位問題之所在&#xf…

selenium+Java自動化

轉載于:https://www.cnblogs.com/arvin-feng/p/11110483.html

html 5 本地數據庫(Web Sql Database)

基于HTML5的Web DataBase 可以讓你在瀏覽器中進行數據持久地存儲管理和有效查詢&#xff0c;假設你的離線應用程序有需要規范化的存儲功能 本文講述如何使用核心方法openDatabase、transaction、executeSql 1.新建一個網頁&#xff0c;比如&#xff1a;test.html 內容如下&am…

前端學習資料及路線名稱網站

IT前端學習資料及路線常用PC端UI組件庫餓了么(Element-UI)https://element.eleme.cn/#/zh-CN常用小程序端UI組件庫uView UIhttp://v1.uviewui.com/名稱網站JQuery文件網https://code.jquery.com/jquery/jQuery手冊&#xff08;pc端&#xff09;http://jquery.cuishifeng.cn/jQu…

JS實現生成一個周對應日期數組

/* 獲取日期和周 */getDateWeek() {/* 得到當前日期的時間戳 */const timestamp Date.now()// const timestamp new Date(2019, 7, 30, 0, 0, 0, 0).getTime()const dateWeek Array.from(new Array(7)).map((_, i) > {/* 得到當前周每一天的時間戳 */const weekTimestamp…

npm升級package.json依賴包

使用npm管理node的包&#xff0c;可以使用npm update <name>對單個包升級&#xff0c;對于npm的版本大于 2.6.1,可以使用命令: npm install -g 升級全局的本地包。 對于版本小于2.6.1的一個一個包的升級實在是太麻煩&#xff0c;就想找到一個升級所有本地包的方法&#x…

Sublime Text 3 快捷鍵匯總

Sublime Text 3非常實用&#xff0c;但是想要用好&#xff0c;老是忘記&#xff0c;匯總一下&#xff0c;方便自己方便別人。 用慣了vim&#xff0c;有些快捷鍵也懶得用了&#xff0c;尤其是在win下面&#xff0c;還有圖形界面&#xff0c;所以個人覺得最有用的還是搜索類&…

Minimal coverage (貪心,最小覆蓋)

題目大意&#xff1a;先確定一個M&#xff0c; 然后輸入多組線段的左端和右端的端點坐標&#xff0c;然后讓你求出來在所給的線段中能夠 把[0, M] 區域完全覆蓋完的最少需要的線段數&#xff0c;并輸出這些線段的左右端點坐標。 思路分析&#xff1a; 線段區間的起點是0&#x…

vuex知識點

Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式&#xff1b;集中存儲和管理應用的所有組件狀態。 狀態&#xff1a;什么是狀態&#xff0c;我們可以通俗的理解為數據。Vue只關心視圖層&#xff0c;那么視圖的狀態如何來確定&#xff1f;我們知道是通過數據驅動&#xff0c…

Kafka2.0生產者客戶端使用

1 初始化配置 Kafka 通過 KafkaProducer 構造器初始化生產者客戶端的配置。 ??常用的重要配置&#xff0c;詳見官網。 bootstrap.servers&#xff1a;Kafka 集群地址&#xff08;host1:post,host2:post&#xff09;&#xff0c;Kafka 客戶端初始化時會自動發現地址&#xff0…

vuex小例

少廢話&#xff0c;先出東西 vuex main.js import Vue from vue import App from ./App import router from ./router import store from ./store Vue.config.productionTip falsenew Vue({el: #app,router,store,render: xx>xx(App) })store.js 平級目錄未建文件夾import…

[論文筆記]CVPR2017_Joint Detection and Identification Feature Learning for Person Search

Title: Joint Detection and Identification Feature Learning for Person Search; aXiv上該論文的第一個版本題目是 End-to-End Deep Learning for Person SearchAuthors: Tong Xiao1* ; Shuang Li1* ; Bochao Wang2 ; Liang Lin2; Xiaogang Wang1 Affilations: 1.The Chines…

php下的原生ajax請求

瀏覽器中為我們提供了一個JS對象XMLHttpRequet&#xff0c;它可以幫助我們發送HTTP請求&#xff0c;并接受服務端的響應。 意味著我們的瀏覽器不提交&#xff0c;通過JS就可以請求服務器。ajax(Asynchronous Javascript And XML)其實就是通過XHR對象&#xff0c;執行HTTP請求。…

HBase性能優化總結

HBase性能優化方法總結&#xff08;一&#xff09;&#xff1a;表的設計 1. 表的設計 1.1 Pre-Creating Regions 默認情況下&#xff0c;在創建HBase表的時候會自動創建一個region分區&#xff0c;當導入數據的時候&#xff0c;所有的HBase客戶端都向這一個region寫數據&#x…