前端的優(yōu)化操作

1、瀏覽器的一個請求從發(fā)送到返回都經(jīng)歷了什么?

1.發(fā)送URL請求到DNS服務(wù)器,獲取域名對應(yīng)的 web服務(wù)器的ip地址

2.與web服務(wù)器建立TCP/IP協(xié)議

3.瀏覽器向web服務(wù)器發(fā)送HTTP GET請求

4.web服務(wù)器響應(yīng)請求,并返回指定url的數(shù)據(jù)

5.瀏覽器下載web服務(wù)器返回的數(shù)據(jù)并解析html源文件

6.生成Dom樹,解析js和css,渲染頁面

image.png

image.png
01.請求過程中一些潛在的性能優(yōu)化點
image.png

2、資源的合并與壓縮

目標(biāo):

* 減少http請求數(shù)量

* 減少請求資源的大小

操作方式:

* html壓縮

image.png

* css壓縮

image.png

* js壓縮與混亂

image.png

image.png

* 文件合并

image.png

image.png

3、圖片相關(guān)的優(yōu)化操作

01.不同格式圖片常用的業(yè)務(wù)場景

* jpg有損壓縮,壓縮率高,不支持透明 —— 大部分不需要透明圖片的業(yè)務(wù)場景
* png支持透明,瀏覽器兼容好 —— 大部分需要透明圖片的業(yè)務(wù)場景
* webp壓縮程度更好,在ios webview有兼容性問題 —— 安卓全部
* svg矢量圖,代碼內(nèi)嵌,相對較小,圖片樣式相對簡單的場景 —— 圖片樣式相對簡單的業(yè)務(wù)場景

02.CSS雪碧圖

image.png

03.Image inline

image.png

04.使用矢量圖

image.png

05.在安卓下使用webp

image.png

4、懶加載與預(yù)加載

* 懶加載:一張圖片就是一個<img>標(biāo)簽,瀏覽器是否發(fā)起請求圖片是根據(jù)<img>的src屬性,所以實現(xiàn)懶加載的關(guān)鍵就是,在圖片沒有進(jìn)入可視區(qū)域時,先不給<img>的src賦值,這樣瀏覽器就不會發(fā)送請求了,等到圖片進(jìn)入可視區(qū)域再給src賦值

* 懶加載作用:減少無效資源的加載,提高用戶體驗,減輕服務(wù)器的壓力,優(yōu)先加載可視區(qū)域的內(nèi)容。


* 預(yù)加載:就是將所有所需的資源提前請求加載到本地,這樣后面在需要用到時就可以直接從緩存中獲取資源

* 預(yù)加載作用:在網(wǎng)頁全部加載之前,對一些主要內(nèi)容進(jìn)行加載,以提供給用戶更好的體驗,減少等待的時間

* 實現(xiàn)預(yù)加載的幾種方法:

* 使用HTML標(biāo)簽
* 使用image對象
* 使用XMLHttpRequest對象,雖然存在跨域問題,但會精細(xì)控制預(yù)加載過程
* 使用PreloadJS庫
image.png

5、css、js 的加載與執(zhí)行 ———— html頁面加載渲染的過程

在頁面加載時,瀏覽器把獲取到的HTML代碼解析成一個DOM樹,DOM樹里包含了所有HTML標(biāo)簽,包括display:none隱藏,還有用JS動態(tài)添加的元素等。

render tree(渲染樹)類似于DOM tree(DOM樹),但區(qū)別很大,因為render tree能識別樣式,同時render tree中每個NODE都有自己的style,而且render tree不包含隱藏的節(jié)點(比如display:none的節(jié)點,還有head節(jié)點),因為這些節(jié)點不會用于呈現(xiàn),而且不會影響呈現(xiàn),所以就不會包含到render tree中。

image.png

實質(zhì):DOM tree(DOM樹)結(jié)合CSS,就渲染除了render tree(渲染樹)

image.png

渲染步驟:

* 第一步,用HTML分析器,分析HTML元素,構(gòu)建一顆DOM樹(標(biāo)記化和樹構(gòu)建)。
* 第二步,用CSS分析器,分析CSS文件和元素上的inline樣式,生成頁面的樣式表。
* 第三步,將DOM樹和樣式表,關(guān)聯(lián)起來,構(gòu)建一顆Render樹(這一過程又稱為Attachment)。每個DOM節(jié)點都有attach方法,接受樣式信息,返回一個render對象(又名renderer)。這些render對象最終會被構(gòu)建成一顆Render樹。
* 第四步,有了Render樹,瀏覽器開始布局,為每個Render樹上的節(jié)點確定一個在顯示屏上出現(xiàn)的精確坐標(biāo)。
* 第五步,Render樹和節(jié)點顯示坐標(biāo)都有了,就調(diào)用每個節(jié)點paint方法,把它們繪制出來。
image.png

6、回流(layout)與重繪(paint)

image.png

回流:當(dāng)render tree中的一部分(或全部)因為元素的規(guī)模尺寸,布局,隱藏等改變而需要重新構(gòu)建。這就稱為回流(reflow)

何時需要回流:當(dāng)頁面布局和幾何屬性改變時就需要回流

image.png

重繪:當(dāng)render tree中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會影響布局的,比如background-color。則就叫稱為重繪

image.png

回流與重繪的區(qū)別:

image.png

新建DOM的過程:

image.png

Chrome創(chuàng)建圖層的條件:

image.png

實際項目中應(yīng)對回流 & 重繪的優(yōu)化操作:

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容