前端性能優(yōu)化

性能優(yōu)化思考維度.jpg

性能優(yōu)化感覺大家都能說出幾條來,粗略點(diǎn)無非是減少http請(qǐng)求、減輕請(qǐng)求數(shù)據(jù)大小等等,詳細(xì)點(diǎn)就是css/js合并壓縮、雪碧圖等等,但實(shí)在是散亂無章,如何有條理地回答面試官的問題就很重要了,其實(shí)可以從不同的維度,不同方面去進(jìn)行回答。前端文章同質(zhì)性太嚴(yán)重了,我最近的我都是總結(jié)整理,不是自己寫的!
總結(jié)自:
鳥瞰前端 , 再論性能優(yōu)化

預(yù)備知識(shí)

“從用戶輸入U(xiǎn)Rl到頁面展示給用戶瀏覽器客戶端的過程中發(fā)生了什么?”

http.jpg

前端經(jīng)典面試題: 從輸入U(xiǎn)RL到頁面加載發(fā)生了什么?

瀏覽器渲染原理

頁面展示過程.png
  1. HTML被解析成DOM Tree,CSS被解析成CSS Rule Tree
  2. 把DOM Tree和CSS Rule Tree經(jīng)過整合生成Render Tree(布局階段)
  3. 元素按照算出來的規(guī)則,把元素放到它該出現(xiàn)的位置,通過顯卡畫到屏幕上

CSS不會(huì)阻塞DOM Tree生成,會(huì)阻塞渲染,但JS會(huì)阻塞DOM 加載。

重繪和回流

如何寫出高性能DOM?

瀏覽器宿主環(huán)境

1. 突破單線程解析渲染阻塞限制

瀏覽器是一個(gè)單線程解析模式去解析渲染從服務(wù)器端拿到的html文本,css加載(渲染)的過程中會(huì)對(duì)后續(xù)的腳本資源加載造成阻塞,腳本的加載也會(huì)阻塞后續(xù)DOM結(jié)構(gòu)的解析造成頁面的留白時(shí)間增長(zhǎng),雅虎的35條軍規(guī)中有一條就是樣式文件放在頭部,腳本文件放在DOM節(jié)點(diǎn)最末尾,減少阻塞。這里還有幾個(gè)針對(duì)腳本文件的優(yōu)化:

  • 針對(duì)不需要DOM操作(主要考慮是需要操作DOM的腳本往往需要獲取一些樣式信息)的Js腳本可以采用動(dòng)態(tài)創(chuàng)建script的方式載入,動(dòng)態(tài)載入的腳本不阻塞后續(xù)資源的加載。
  • 腳本文件加載可以加上defer或者async屬性標(biāo)識(shí)防止阻塞
    defer是在HTML解析完之后才會(huì)執(zhí)行,如果是多個(gè),按照加載的順序依次執(zhí)行
    async是在加載完成后立即執(zhí)行,如果是多個(gè),執(zhí)行順序和加載順序無關(guān)

2. 避開Cookie性能bug——靜態(tài)資源CDN

Cookie是前端作為前后臺(tái)登錄態(tài)校驗(yàn)最通常用的緩存方案,但鑒于瀏覽器在每次都會(huì)往同域的任何資源的http請(qǐng)求中自動(dòng)帶上cookie信息的情況,這里有必要進(jìn)行優(yōu)化一下,因?yàn)橄馽ss、js、image這些資源請(qǐng)求是不需要cookie信息的,會(huì)無端造成請(qǐng)求帶寬的浪費(fèi)(想象一下我們的cookie大小假設(shè)為10K,100個(gè)請(qǐng)求就是近1M的大小,高并發(fā)下以我們現(xiàn)行網(wǎng)絡(luò)帶寬也是蠻大的一筆負(fù)擔(dān)了)。

Cookie free性能優(yōu)化方案的處理方式是CDN異域靜態(tài)資源服務(wù)器部署我們的前端css、js、image資源。

3. 代碼優(yōu)化——事件委托等

其實(shí)這里有很多點(diǎn):

  • 要插入DOM片段時(shí)最好使用fragment一次性插入;
  • 動(dòng)態(tài)生成100li如何綁定事件,可以通過事件冒泡利用事件委托給父元素綁定事件即可;
  • 對(duì)于查找過的節(jié)點(diǎn)可以緩存下來,避免再次查找
  • ...

DNS層

DNS預(yù)解析

前端優(yōu)化:DNS預(yù)解析提升頁面速度
這里也是我第一次遇到link標(biāo)簽的另外用法。

HTTP層

1. 減少HTTP請(qǐng)求數(shù)量

  1. 合并CSS、JS文件
  2. CSS sprites雪碧圖
  3. font-icon字體圖標(biāo)
  4. 圖片base64編碼傳輸
  5. 圖片懶加載
  6. HTTP緩存機(jī)制

2. 減輕HTTP請(qǐng)求數(shù)據(jù)大小

  1. css、script、圖片壓縮:這些可以gulp或者webpack自動(dòng)化腳本里面定義腳本任務(wù)來完成。

  2. 服務(wù)器開啟gzip壓縮:一般現(xiàn)在服務(wù)器都有開啟Gzip壓縮,壓縮率通常都是30%以上,效果還是不錯(cuò)的。

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

相關(guān)閱讀更多精彩內(nèi)容

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