摘要:三種渲染流程實際場景下,大概會有三種常見的渲染流程注意和步驟是可避免的優(yōu)化瀏覽器會在和加載完開始渲染頁面。優(yōu)化避免阻塞解析器通過以上兩種方式引入均會阻塞,因而會阻塞出現(xiàn)在腳本后面的標(biāo)記的渲染。
瀏覽器渲染原理
JavaScript瀏覽器渲染流程
JavaScript實現(xiàn)動畫效果,DOM元素操作等。
CSSOM確定每個DOM元素應(yīng)該應(yīng)用什么CSS規(guī)則。
RenderTree(渲染樹)注意: CSS選擇器越詳細(xì),匹配工作越多,匹配節(jié)點越慢。
RenderTree包含了渲染網(wǎng)頁所需的節(jié)點, 無需渲染的節(jié)點不會被添加到RenderTree中。 如:
,display: none的節(jié)點Layout(布局)注意:因為設(shè)置了visibility:hidden的元素雖不可見,但仍然占有空間,仍會被添加到RenderTree。
計算每個DOM元素在最終屏幕上顯示的大小和位置。由于web頁面的元素布局是相對的,所以其中任意一個元素的位置發(fā)生變化,都會聯(lián)動的引起其他元素發(fā)生變化,這個過程叫reflow。
觸發(fā)Layout注意:影響web性能的一個重要的問題就是repaint和reflow。
屏幕旋轉(zhuǎn)
瀏覽器視窗改變
與大小位置相關(guān)的CSS屬性改變
Paint(繪制)根據(jù)background,border,box-shadow等樣式,將Layout生成的區(qū)域填充為最終將顯示在屏幕上的像素
Composite(渲染層合并)按照合理的順序合并圖層然后顯示到屏幕上。
三種渲染流程實際場景下,大概會有三種常見的渲染流程:
JavaScript -> CSS -> Layout -> Paint -> Composite
JavaScript -> CSS -> Paint -> Composite
JavaScript -> CSS -> Composite
優(yōu)化CSS注意:Layout和Paint步驟是可避免的
瀏覽器會在DOM和CSSOM加載完開始渲染頁面。
避免CSS阻塞初次渲染通過以上兩種方式定義的CSS,均會阻塞初次渲染。瀏覽器會在解析完CSS后,再進行渲染。這是為了防止樣式突變帶來的抖動。通過link標(biāo)簽引入的CSS阻塞的時間可能更長,因為加載它需要一個網(wǎng)絡(luò)來回時間
media query此樣式表仍會加載。當(dāng)瀏覽器環(huán)境不匹配媒體查詢條件時,該樣式表不會阻塞渲染。我們可針對不同媒體環(huán)境拆分CSS文件,并為link標(biāo)簽添加媒體查詢,避免為了加載非關(guān)鍵CSS資源,而阻塞初次渲染
通過DOM API添加linkvar style = document.createElement("link"); style.rel = "stylesheet"; style.href = "index.css"; document.head.appendChild(style);
該方法不會阻塞初次渲染。
preloadrel不是stylesheet,因此不會阻塞渲染。preload是resoure hint規(guī)范中定義的一個功能,resource hint通過告知瀏覽器提前建立連接或加載資源,以提高資源加載的速度。瀏覽器遇到遇到標(biāo)記為preload的link時,會開始加載,當(dāng)onload事件發(fā)生時,將rel改為stylesheet,即可應(yīng)用此樣式。
總結(jié)引入CSS資源的方法 | 是否阻塞初次渲染 |
---|---|
是 | |
通過document.write寫入以上標(biāo)簽 | 是 |
通過DOM API插入HTMLLinkElement對象 | 否 |
使用preload方式載入CSS | 否 |
為link添加media query | 當(dāng)媒體查詢不匹配時,不會阻塞 |
由于瀏覽器的優(yōu)化,現(xiàn)代瀏覽器的樣式計算直接對目標(biāo)元素執(zhí)行,而不是對整個頁面執(zhí)行,所以我們應(yīng)該盡可能減少需要執(zhí)行樣式計算的元素的個數(shù)。
JavaScript優(yōu)化 避免Javascript阻塞HTML Parser(解析器)<-- inline js --> <-- external js -->
通過以上兩種方式引入js均會阻塞HTML parser,因而會阻塞出現(xiàn)在腳本后面的HTML標(biāo)記的渲染。而外部script阻塞的時間一般更長,因為可能包含了一個網(wǎng)絡(luò)來回時間。
Javascript可以通過document.write修改HTML文檔流,因此在執(zhí)行js時,瀏覽器會暫停解析DOM的工作。
CSS阻塞JS<-- inline js --> <-- external js -->
通過以上兩種方式引入的JS均會被CSS阻塞,由于這些Javascript可能會讀取或修改CSSOM,因此需等待CSSOM構(gòu)造完成后,它們才能執(zhí)行
將資源放到文檔底部,延遲js執(zhí)行使用defer延遲腳本執(zhí)行世界上最美麗的語言是什么?
世界上最美麗的語言是什么?
當(dāng)script標(biāo)簽擁有defer屬性時,該腳本會被推遲到整個HTML文檔解析完后,再開始執(zhí)行。被defer的腳本,在執(zhí)行時會嚴(yán)格按照在HTML文檔中出現(xiàn)的順序執(zhí)行
使用async異步加載腳本注意: 使用defer時,瀏覽器會保證腳本按照在文檔中出現(xiàn)的順序執(zhí)行
Hello World
當(dāng)script標(biāo)簽擁有async屬性時,該腳本不會再阻塞HTML parser。且不會被CSS阻塞。
腳本只要加載完成,便可開始執(zhí)行。
被async的腳本,在執(zhí)行時會不會嚴(yán)格按照在HTML文檔中出現(xiàn)的順序執(zhí)行
async適用于無依賴的獨立資源
總結(jié)引入JS資源的方法 | 是否阻塞文檔內(nèi)容初次渲染 |
---|---|
在head中引入外部腳本或內(nèi)聯(lián)腳本 | 是 |
將腳本放到body底部 | 否 |
為腳本添加defer屬性 | 否 |
為腳本添加async屬性 | 否 |
setTimeout(callback)和setInterval(callback)無法保證callback函數(shù)的執(zhí)行時機,很可能在幀結(jié)束的時候執(zhí)行,從而導(dǎo)致丟幀。requestAnimationFrame(callback)可以保證callback函數(shù)在每幀動畫開始的時候執(zhí)行。
用Web Worker去處理耗時的JS代碼幀丟失
JavaScript代碼運行在瀏覽器的主線程上,與此同時,瀏覽器的主線程還負(fù)責(zé)樣式計算、布局、繪制的工作,如果JavaScript代碼運行時間過長,就會阻塞其他渲染工作,很可能會導(dǎo)致丟幀。
每幀的渲染應(yīng)該在16ms內(nèi)完成,但在動畫過程中,由于已經(jīng)被占用了不少時間,所以JavaScript代碼運行耗時應(yīng)該控制在3-4毫秒。
如果真的有特別耗時且不操作DOM元素的純計算工作,可以考慮放到Web Workers中執(zhí)行。
var dataSortWorker = new Worker("sort-worker.js"); dataSortWorker.postMesssage(dataToSort); // 主線程不受Web Workers線程干擾 dataSortWorker.addEventListener("message", function(evt) { var sortedData = e.data; // Web Workers線程執(zhí)行結(jié)束 // ... });用多個frame去處理DOM元素的更新
由于Web Workers不能操作DOM元素的限制,所以只能做一些純計算的工作,對于很多需要操作DOM元素的邏輯,可以考慮分步處理,把任務(wù)分為若干個小任務(wù),每個任務(wù)都放到requestAnimationFrame中回調(diào)執(zhí)行。
var taskList = breakBigTaskIntoMicroTasks(monsterTaskList); requestAnimationFrame(processTaskList); function processTaskList(taskStartTime) { var nextTask = taskList.pop(); // 執(zhí)行小任務(wù) processTask(nextTask); if (taskList.length > 0) { requestAnimationFrame(processTaskList); } }Layout優(yōu)化 避免觸發(fā)布局
當(dāng)修改了元素的屬性之后,瀏覽器將會檢查為了使這個修改生效是否需要重新計算布局以及更新渲染樹,對于DOM元素的“幾何屬性”修改,比如width/height/left/top等,都需要重新計算布局。
使用flexbox替代老的布局模型老的布局模型以相對/絕對/浮動的方式將元素定位到屏幕上。Floxbox布局模型用流式布局的方式將元素定位到屏幕上。
通過一個小實驗可以看出兩種布局模型的性能差距,同樣對1300個元素布局,浮動布局耗時14.3ms,F(xiàn)lexbox布局耗時3.5ms
瀏覽器為了避免FOUT(Flash Of Unstyled Text),會盡量等待字體加載完成后,再顯示應(yīng)用了該字體的內(nèi)容
只有當(dāng)字體超過一段時間仍未加載成功時,瀏覽器才會降級使用系統(tǒng)字體。每個瀏覽器都規(guī)定了自己的超時時間
但這也帶來了FOIT(Flash Of Invisible Text)問題。內(nèi)容無法盡快地被展示,導(dǎo)致空白。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/83820.html
摘要:當(dāng)解析被阻止時,這里,和會同時下載,所以關(guān)鍵路徑長度仍為如何縮短關(guān)鍵呈現(xiàn)路徑長度瀏覽器會有并行加載資源數(shù)的限制,如果網(wǎng)頁很大,會需要來回多次獲取資源。所以要根據(jù)情況合理控制文件資源大小參考優(yōu)達的網(wǎng)站性能優(yōu)化 回顧 關(guān)鍵渲染路徑 showImg(https://segmentfault.com/img/bVKDWG?w=319&h=599); 簡說瀏覽器渲染--關(guān)鍵渲染路徑 渲染性能優(yōu)化...
摘要:當(dāng)解析被阻止時,這里,和會同時下載,所以關(guān)鍵路徑長度仍為如何縮短關(guān)鍵呈現(xiàn)路徑長度瀏覽器會有并行加載資源數(shù)的限制,如果網(wǎng)頁很大,會需要來回多次獲取資源。所以要根據(jù)情況合理控制文件資源大小參考優(yōu)達的網(wǎng)站性能優(yōu)化 回顧 關(guān)鍵渲染路徑 showImg(https://segmentfault.com/img/bVKDWG?w=319&h=599); 簡說瀏覽器渲染--關(guān)鍵渲染路徑 渲染性能優(yōu)化...
摘要:當(dāng)解析被阻止時,這里,和會同時下載,所以關(guān)鍵路徑長度仍為如何縮短關(guān)鍵呈現(xiàn)路徑長度瀏覽器會有并行加載資源數(shù)的限制,如果網(wǎng)頁很大,會需要來回多次獲取資源。所以要根據(jù)情況合理控制文件資源大小參考優(yōu)達的網(wǎng)站性能優(yōu)化 回顧 關(guān)鍵渲染路徑 showImg(https://segmentfault.com/img/bVKDWG?w=319&h=599); 簡說瀏覽器渲染--關(guān)鍵渲染路徑 渲染性能優(yōu)化...
摘要:下面我們撇開網(wǎng)絡(luò)方面的優(yōu)化,只分析靜態(tài)資源方面的優(yōu)化。不過,也會阻止的構(gòu)建和延緩網(wǎng)頁渲染。未優(yōu)化正常加載優(yōu)化后異步加載根據(jù)上面的分析,我們可以清楚的認(rèn)識到,非必要優(yōu)先加載的,選擇異步加載是最優(yōu)選擇。 為什么做優(yōu)化 經(jīng)典問題:白屏?xí)r間過長,用戶體驗差產(chǎn)生的原因:網(wǎng)絡(luò)問題、關(guān)鍵渲染路徑(CRP)問題 怎么做優(yōu)化 如何做好優(yōu)化呢,網(wǎng)上隨便一搜,就有很多優(yōu)化總結(jié),無非就是網(wǎng)絡(luò)優(yōu)化、靜態(tài)資源(h...
摘要:下面我們撇開網(wǎng)絡(luò)方面的優(yōu)化,只分析靜態(tài)資源方面的優(yōu)化。不過,也會阻止的構(gòu)建和延緩網(wǎng)頁渲染。未優(yōu)化正常加載優(yōu)化后異步加載根據(jù)上面的分析,我們可以清楚的認(rèn)識到,非必要優(yōu)先加載的,選擇異步加載是最優(yōu)選擇。 為什么做優(yōu)化 經(jīng)典問題:白屏?xí)r間過長,用戶體驗差產(chǎn)生的原因:網(wǎng)絡(luò)問題、關(guān)鍵渲染路徑(CRP)問題 怎么做優(yōu)化 如何做好優(yōu)化呢,網(wǎng)上隨便一搜,就有很多優(yōu)化總結(jié),無非就是網(wǎng)絡(luò)優(yōu)化、靜態(tài)資源(h...
閱讀 3853·2021-10-08 10:12
閱讀 4392·2021-09-02 15:40
閱讀 951·2021-09-01 11:09
閱讀 1610·2021-08-31 09:38
閱讀 2547·2019-08-30 13:54
閱讀 2254·2019-08-30 12:54
閱讀 1248·2019-08-30 11:18
閱讀 1406·2019-08-29 14:06