分析不同類型頁面渲染過程

現在讓我們看看瀏覽器從網絡上加載資源所耗費的時間(我們忽略從緩存以及從CDN等中間商網絡上加載資源),我們首先要知道的是:

  • 一個到無服務的網路往返?(傳播延遲) 大約100ms
  • 服務器對于HTML文檔的響應大約100ms,對于其他資源大約10ms

The Hello World experience

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critical Path: No Style</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

我們只是加載了時間和網頁——沒有任何的js和css資源等——我們的頁面非常簡單,下面我們看看谷歌瀏覽器開發者工具里記錄下載用的時間:

CRP

HTML文檔大約花費200ms來加載。注意上面的藍色透明進度條表明了網路上的一個往返,這里我們的HTML文檔非常的小(小于4k),我們只是進行了簡單的文件抓取工作,一半的時間來等待網絡響應,一般的時間花費在服務器響應上,總用時大于200ms。

一旦HTML文檔內容可以使用,瀏覽器開始解析HTML內容(全部是字節),將其轉化成tokens,然后建立DOM樹。注意在工具條最下面顯示了DOMContentLoaded事件花費的時間是216毫秒,也就是對應的藍色垂直實線。在藍色透明進度條和藍色垂直實線之間的時間就是瀏覽器建立DOM樹的時間——在上例中只是花費了幾毫秒。

注意我們的“awesome photo”沒有阻塞任何的DOMContentLoaded事件,所以我們可以直接構造render tree甚至將內容顯示在屏幕上,不用等待圖片資源:不是所有的資源都會阻塞渲染!所以,在談論渲染過程的時候,我們只是談論了js,css和html標記。圖片雖然不會阻塞渲染,但是我們仍舊應該讓其迅速加載顯示。

但是,“load”事件(也被叫做"onload")事件卻被圖片加載阻塞:因為load事件是在所有資源加載完畢之后觸發,上圖中也即是最后的紅色垂直實線,也就是工具條最下面顯示的load:335ms,這也是瀏覽器加載器停止加載的時間點。

Adding JavaScript and CSS into the mix

實際的編程中肯定需要css和js,所以讓我們在其中加入css和js:

<html><head><title>Critical Path: Measure Script</title><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body onload="measureCRP()"><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="timing.js"></script></body>
</html>

在加入js和css之前:

DOM CRP

在加入js和css之后

DOM, CSSOM, JS

css文件和js文件都在異步同時被加載,這是好事!注意load和DOMContentLoaded和之前的微妙的不同:

  • 不像只是簡單的HTML文件(不包含任何的css和js),包含js和css的文件還需要將css編程CSSOM樹,以及CSSOM樹和HTML樹相互結合形成render tree的過程。
  • 因為js文件可能要處理CSSOM,所以css文件必須在執行js文件之前執行!并且css的下載將會阻塞domContentLoaded事件。

如果我們將js直接寫在html內部呢?

外部js導入:

DOM, CSSOM, JS

直接書寫js:

DOM, CSSOM, and inlined JS

雖然我們減少了一次加載請求,但是事件是差不多的,因為在解析script標簽的時候將會阻塞直到CSSOM被創建完成。同時,從上圖中我們可以看見,css和js文件的加載是平行進行的。

所以,我們有什么策略來減少事件呢?

讓我們在js文件中加入async異步關鍵字:

<html><head><title>Critical Path: Measure Async</title><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body onload="measureCRP()"><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script async src="timing.js"></script></body>
</html>

?

?

同步內部加載js:

DOM, CSSOM, JS

異步外部加載js:

DOM, CSSOM, async JS

可以看見domContentLoade事件在HTML解析完成后馬上執行:瀏覽器知道了不要在處理js中對其進行阻塞,因為沒有了其他渲染的阻塞,CSSOM構造可以同時進行。

我們可以同時在文件內部書寫js和css文件內容,而不是外部引入:

<html><head><title>Critical Path: Measure Inlined</title><meta name="viewport" content="width=device-width,initial-scale=1"><style>p { font-weight: bold }span { color: red }p span { display: none }img { float: right }</style></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script>var span = document.getElementsByTagName('span')[0];span.textContent = 'interactive'; // change DOM text content
      span.style.display = 'inline';  // change CSSOM property// create a new element, style it, and append it to the DOMvar loadTime = document.createElement('div');loadTime.textContent = 'You loaded this page on: ' + new Date();loadTime.style.color = 'blue';document.body.appendChild(loadTime);</script></body>
</html>

DOM, inline CSS, inline JS

可以看見domContentLoaded事件的時間和異步加載外部js文件例子中個domContentLoadedNotice時間差不多。

將css和js文件內容直接書寫在html文件內部,雖然會讓html變得非常龐大,但是可以減少外部資源的加載。

優化模式

最簡單的html就是沒有css和js亦或依他資源,只有html內容。

渲染這種頁面,瀏覽器你需要初始化請求,等待html文檔加載完成,解析它,建立DOM樹,最后渲染到屏幕上:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critical Path: No Style</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

?

Hello world CRP

?T0?和T1?之間的時間捕捉了網絡和服務器操作的時間。

?在理想情況下(如果HTML文檔足夠小),所有我們需要做的就是使用一個網絡往返來獲取整個文件——根據TCP傳輸協議,文件越大需要越多的網絡往返。所以上圖是建立在最理想的狀況下,加載文件只要一個網絡往返。

讓我們增加css文件:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

DOM + CSSOM CRP

我們使用了一個網絡往返來獲取HTML資源,在將內容最終渲染到屏幕上之前我們必須要加載css文件,所以我們使用了一個網絡往返來獲取css文件,最后渲染頁面。注意我們這里每次獲取資源使用一個網絡往返是建立在資源非常小的情況下,也就是說最理想的狀態下。

讓我們使用關鍵術語來描述渲染過程:

  • 關鍵資源:?資源可能會阻塞頁面的渲染(這是使用可能是因為圖片等資源是不會阻塞頁面的渲染的,只有css和js資源會)
  • 渲染路徑長度:?網絡往返的次數,亦或獲取所有資源的總時間 number of roundtrips, or the total time required to fetch all of the critical resources.
  • 關鍵字節:?頁面第一次渲染時所需要的字節數,也就是將關鍵資源文件大小的總和。
  • 我們上面第一個最簡單的網頁形式的例子,就包含了一個關鍵資源(HTML文檔),關鍵路徑長度是1個網絡往返(假設文件非常小),總共的關鍵字節是HTML文檔的字節大小。

讓我們比較上面HTML+CSS文件的渲染過程:

DOM + CSSOM CRP

  • 2?關鍵文件:CSS文件和HTML文檔
  • 2?或者更多的路徑長度:加載css和HTML時所分別需要一個網絡往返?
  • 9?KB 的關鍵字節:2個關鍵文件的總和

現在讓我們加入js:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js"></script></body>
</html>

過程是,加載完了HTML之后,同時加載css和js文件,因為js要查詢CSSOM,所以必須等到cssom建立完成知乎才可以運行js,之后建立DOM,最后渲染頁面。

DOM, CSSOM, JavaScript CRP

  • 3?個關鍵文件:CSS和JS和HTML文件分別一個
  • 2?或者更多的路徑長度:因為加載css和js是同時進行的,也就是說在同一個網絡往返中,加載HTML進行了一次網絡往返
  • 11?KB 的關鍵字節:3個關鍵文件的大小綜合

異步加載js文件:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

?

?

DOM, CSSOM, async JavaScript CRP

異步加載js的好處:

  • js腳本不會讓瀏覽器在解析其他文件時對其進行阻塞,也不會影響關鍵渲染進程
  • 因為關鍵文件中不再包含js腳本文件,css同樣不需要阻塞domContentLoaded事件
  • domContentLoaded事件越快被觸發,其他的應用邏輯也會越快被執行

所以,最后的結果是我們只有兩個關鍵文件,且我們只有兩個路徑長度(因為我們只進行了兩次網路往返),并且9kb的關鍵字節。

?

如果css只是針對打印機設備呢?

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet" media="print"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

DOM, non-blocking CSS, and async JavaScript CRP

因為css資源只是用于打印機設備,所以瀏覽器不需要下載css時進行渲染阻塞,所以,一旦DOM構造完成,瀏覽器就有足夠的信息來渲染頁面!

所以,文檔只有一個關鍵文件(HTML文檔),最小的渲染路徑(只有一個網絡往返)。

?

原文:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/analyzing-crp?hl=en

轉載于:https://www.cnblogs.com/RachelChen/p/5456189.html

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

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

相關文章

引入 javascript_在您JavaScript項目中引入類型安全性? 再想一想

引入 javascriptby James Wright詹姆斯賴特(James Wright) 在您JavaScript項目中引入類型安全性&#xff1f; 再想一想 (Introducing Type Safety To Your JavaScript Project? Think Again) 更新— 2017年2月1日 (Update — 1st February 2017) I’ve heard various counter…

劣幣驅逐良幣通俗解釋_如何通俗理解劣幣驅逐良幣的問題,同時如何扭轉這個現象?...

以牛奶為例談劣幣驅逐良幣。【原來】大家都賣的純正的純牛奶&#xff0c;因為。牛奶的來源和生產工藝基本上都差不多&#xff0c;所以說產品的品質也沒有什么大的差異。【后來】奶制品企業為了爭奪市場開始打價格戰&#xff0c;你賣5塊我就賣4塊&#xff0c;你賣4塊我就賣3塊5&…

c語言里 如何取得線程的lpparameter'參數,請問線程函數如何訪問對話框類中的變量...

我線程函數定義在對話框類的實現文件中需要訪問對話框類頭文件中聲明的變量怎么才可以&#xff1f;i_noname(晚九朝五) 于 2005-9-15 16:14:25DWORD WINAPI Proc(LPVOID lpParameter ){CDialog *pDlg (CDialog *)lpParameter;...}啟用線程時把對話框指針傳進去AfxBeginThread(…

Android內存優化——內存泄露檢測分析方法

上一篇文章總結了一些常見的內存泄露場景及優化方案&#xff0c;這篇文章繼續總結內存泄露的一些常用的檢測和分析方法。 Lint代碼檢查 AndroidStudio自動Lint代碼檢查工具&#xff0c;一些常見的代碼警告Lint工具都會給我們提示。使用也比較簡單&#xff1a; Analyze —> I…

ImageLoader加載圖片

先導universal-image-loader-1.9.3包 在application配置 android:name".MyApplication" intent權限 1 package com.ch.day13_imageloaderdemo;2 3 import java.io.File;4 5 import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; 6 impor…

hackintosh黑蘋果_為什么您的下一個Mac應該是Hackintosh?

hackintosh黑蘋果by Sebastian Dobrincu塞巴斯蒂安多布林庫(Sebastian Dobrincu) 為什么您的下一個Mac應該是Hackintosh&#xff1f; (Why Your Next Mac Should Be a Hackintosh ?) I just finished a 48-hour Hackintosh building marathon. It was a fun experience and I…

一張圖解釋什么是遺傳算法_遺傳算法簡介及代碼詳解

(allele)數據值&#xff0c;屬性&#xff0c;值基因座(locus)位置&#xff0c;iterator位置表現型(phenotype)參數集&#xff0c;解碼結構&#xff0c;候選解染色體&#xff1a;又可以叫做基因型個體(individuals)群體/種群(population)&#xff1a;一定數量的個體組成&#xf…

c語言程序設計學生程序查詢,《c語言程序設計報告-學生信息管理系統》.doc

《c語言程序設計報告-學生信息管理系統》中南大學??C語言程序設計實踐報告?????題 目 學生信息管理系統學生姓名 張眼指導教師 劉偉榮學 院 信息科學與工程學院專業班級 電氣信息1113班完成時間 2012年6月28日星期四?1.設計任務及設計目標學生信息管理系統是基于系統主…

ListString 和 ArrayListString的區別

最近對這兩個問題比較懵逼&#xff0c;關于List和ArrayList、List<String> list new ArrayList<String>(); 好了&#xff0c;先搞明白List 和 ArrayList吧。 List是一個接口&#xff0c;是Collection接口的一個子接口&#xff0c;是一個有序的集合。 ArrayList是L…

java城市級聯一次查詢_我的城市沒有任何設計活動,所以我自己組織了一次。...

java城市級聯一次查詢by Marty Laurita由Marty Laurita 我的城市沒有任何設計活動&#xff0c;所以我自己組織了一次。 (There weren’t any design events in my city, so I organized one myself.) “The meeting of two personalities is like the contact of two chemical…

Access denied for user 'root'@'localhost' (using password: YES) 問題解決小記

初學php&#xff0c;按照視頻安裝后好mysql后 終端運行命令 mysql -u root -p 然后輸入安裝mysql時輸入的密碼六個1&#xff0c;會報這樣的錯誤&#xff1a;Access denied for user rootlocalhost (using password: YES) &#xff1b; 百度了一大堆&#xff0c;大海撈針一般找…

匯編總結2

一、寄存器 一個典型的cpu是由運算器&#xff0c;控制器&#xff0c;寄存器等器件組成的。 內部總線實現CPU內部各個器件之間的聯系 外部總線實現cpu和主板上其他器件的聯系 AX,BX,CX,DX通用寄存器 SI,DI,BP,SP基址和變址寄存器 CS,SS,DS,ES段寄存器 IP,FLAGS指令指針和標志寄存…

創業者具備的五大技能_一、如今大學生創業需要具備哪些知識與技能?

我參加過兩次互聯網&#xff0b;大賽&#xff0c;分別獲得過省賽的金獎與銀獎&#xff0c;還曾參加山東省大大小小比賽26場&#xff0c;金獎累計獲得12次。對當代創業的大學生所應具備哪些基本素質深有體會。&#xff08;1&#xff09;技能&#xff1a;1、自我認知及科學規劃能…

c語言定時器回調函數的參數,定時器的簡單實現即回調函數的運用

&#xfeff;&#xfeff;這兩天在 研究回調函數就想實現簡單的定時器&#xff0c;如下是鄙人的程序望指教。ios#include #include using namespace std;app#define MAXNUM 256函數typedef void (*timerProcessFunc)(void*);spatypedef struct{unsigned int id;int timeout; /…

BZOJ3387柵欄行動

首先&#xff0c;很容易想到Dp。設f[i][0]表示第i個柵欄走左邊的最短路&#xff0c;f[i][1]表示第i個柵欄走右邊的最短路。 所以&#xff0c;我們要找一個剛好在第i個柵欄的左右邊界下面的柵欄。如圖所示&#xff1a; 則有&#xff1a; f[i][0] min(f[k][0] |Left[i] - Left[…

udacity開源的數據_評論:Udacity數據分析師納米學位計劃

udacity開源的數據by David Venturi大衛文圖里(David Venturi) 評論&#xff1a;Udacity數據分析師納米學位計劃 (Review: Udacity Data Analyst Nanodegree Program) Udacity’s Data Analyst Nanodegree program was one of the first online data science programs in the …

凌晨四點鐘深圳的風景

科比有過一句很勵志的故事&#xff1a;凌晨四點鐘洛杉磯的風景。 很多人把科比當成榜樣&#xff0c;不僅僅因為他精湛的球技&#xff0c;更是因為他遠超常人的職業精神。 其實做到這一點&#xff0c;并不難&#xff0c;難的是堅持。堅持那么早時間起床&#xff0c;堅持十年如一…

小程序沉浸式_古北水鎮紅葉祭嵌入戲精學院 全新文旅沉浸模式讓游客嗨起來...

2020年10月17日-24日&#xff0c;古北水鎮第二屆紅葉祭火熱來襲。今年除了“超級漫展二次元度假”的模式&#xff0c;古北水鎮與頂級沉浸互動體驗運營方——INX戲精學院合作&#xff0c;在深度體驗空間的同時&#xff0c;加入了互動式的實景游戲體驗&#xff0c;通過演員互動&a…

又拍云劉平陽,理性競爭下的技術品牌提升之道

云服務市場趨漸平穩&#xff0c;在這種情況下&#xff0c;就需要通過對某一項技術的深入應用來實現服務的精致化。同時&#xff0c;對品牌的打造和包裝也必不可少。\\又拍云在2010年開始提供云服務&#xff0c;經過多年的發展&#xff0c;以及市場策略的轉變&#xff0c;決定對…

編寫代碼的工作在哪找_編寫事件代碼如何幫助我獲得了出色的工作

編寫代碼的工作在哪找Everyone kept telling me about the importance of networking, but it was always something I blew off. I’m pretty quiet and introverted, particularly when meeting strangers. I thought I just wasn’t built for networking.每個人都在不斷告訴…