了不起的前端性能優化

前言

說到前端性能優化,絕對是對一個前端攻城獅的綜合考量 ~ 作爲一個前端,在功能ok的前提下,最重要的應該就是體驗了,有人說:

  • 正常打開一個頁面超過3 ~ 5秒等待,還沒有打開,我就不會等了
  • 這個活動也太low了,體驗一點都不好
  • 每次新打開同一個頁面都好慢
  • 還有 x x x … …

通過上邊的一個簡單場景,可以想到,在前端中,性能優化,體驗優化是多麼重要的一件事兒,大家在日常使用各大產品中一定也有遇到體驗效果不佳的杯具吧。好,接下來讓我們從以下幾點來分析一下。

  • 網絡請求 重要
  • 編碼規範與方式方法 賊重要
  • 從輸入URL到頁面渲染經歷了什麼 附加擴展

網絡請求

網絡請求是web性能優化的一大重要知識點,不管是請求靜態資源Img ,Js文件,Css文件 還是請求文檔數據,HTTP響應報文,我們都需要考慮以下幾種優化

  • 請求靜態資源文件,打包,合併多個資源文件,壓縮,減少請求次數,複雜情況可追加按需加載
  • 請求圖片文件,做到懶加載,預加載,圖片壓縮
  • 其它網絡請求,按需加載,合併多個接口,減少請求次數
  • 瀏覽器緩存,利用HTTP緩存機制對圖片及靜態資源合理緩存,提升渲染效率

日常編碼

說到編碼,可能就比較抽象了,每個人的 編碼方式都不一樣,在這裏列舉幾種常見的

Js方面
1,減少DOM頻繁操作,儘量合併批量操作
2,理性使用閉包,做到及時釋放私有作用域變量
3,避免動態註冊事件 addeventlistener,做到及時銷燬事件
4,合理使用定時器和全局變量,做到及時清除與銷燬
5,頻繁高併發的事件使用函數防抖和節流

Css方面
1,避免使用通配符 *
2,選擇器儘量不超過兩層的嵌套,便於CSSParser 解析,可採用最大父級不同類,
3,避免頻繁使用可繼承屬性,最好做到依賴父級,類似 color ,font-size

Html 方面
1,引入資源文件的順序,做到不必要的放置在文檔後邊
2,HTML加載Js會堵塞,因此所有的Js儘量放在HTML文檔主體結束標籤 上邊
3,HTML加載Css不會堵塞,因此可以放在標籤內

從輸入URL到頁面渲染經歷了什麼

在瀏覽器輸入 URL 首先會對 URL 地址進行域名解析,然後 TCP 傳輸, 中間夾雜着 HTTP 請求,最後瀏覽器解析 HTTP 響應報文進行文檔渲染;這裏針對DNS域名解析,TCP三次握手四次揮手,HTTP請求報文與響應報文,我們不做深度探索,後續深究;就拿最後一步瀏覽器針對文檔渲染來說說 。

瀏覽器解析文檔資源並渲染頁面是個怎樣的過程呢

1,瀏覽器通過 HTMLParser 把 HTML 解析成 DOM Tree (俗稱DOM樹)。
2,瀏覽器通過 CSSParser 把 CSS 解析成 CSS Rule Tree(俗稱CSSOM樹)。
3,瀏覽器將 JavaScript 通過 DOM API 或者 CSSOM API 將 JS 代碼解析並應用到佈局中,按要求呈現響應的結果。根據 DOM 樹和 CSSOM 樹來構造 render Tree(RANDER樹)。

這三步遍是瀏覽器解析文檔渲染頁面的大概過程了,最終的 rander 樹就是整個頁面的文檔結構抽象表示,顯然這些都是瀏覽器自己做的事情,那我們要如何針對URL渲染來做優化呢 ? 不要急,接着看

layout:重排(俗稱迴流),當 render tree 中任一節點發生位置改變,就會重新佈局,重新來計算所有節點在屏幕的位置。
repaint:重繪,當 render tree 中任一元素樣式屬性發生變化時,都會重新繪製,比如字體大小,顏色等。

通過上邊的兩種情況,我們可以聯想到,減少頁面的重排與重繪j就可以大大提升渲染的效率和體驗性能 。所以從側面推敲一下

1,減少動態操作DOM增加減少元素以及修改DOM節點位置大小,避免重排(迴流)
2,減少動態設置DOM元素樣式屬性,避免重繪

結論:減少零碎的DOM操作,儘量做到批量更新操作(不分節點還是樣式屬性)

注:目前比較主流技術棧Vue,React 等,在不操作DOM的同時,如何使用 webpack 優化,後期補充到對應文章 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章