主要內容為下面幾大類:移動端、圖片、JavaScript、css、html、頁面內容、服務器、cookie。
移動端性能優化:
-
保持單個文件小於25KB
移動網站頁面要求下載資源,如果文件過大,會大大減慢頁面加載速度。 -
打包內容為分段multipart文檔
由於HTTP請求每一次都會執行三次握手,每次握手都會消耗較多的時間。使用multipart,實現了多文件同時上傳,可用一個HTTP請求獲取多個組件。
圖片優化:
-
CSS sprites
俗稱 CSS 精靈、雪碧圖,雪花圖等。即將多張小圖片合並成一張圖片,達到減少 HTTP 請求的一種解決方案。可通過 CSS中的background 屬性訪問圖片內容。這種方案同時還可以減少圖片總字節數,節省命名詞匯量。 -
壓縮圖片
圖片占據資源極大,因此盡量避免使用多余的圖片,使用時選擇最合適的格式大小,然后使用智圖壓縮,同時在代碼中用Srcset來按需顯示。(切記不要過分壓縮 可能會導致圖片迷糊) -
盡量避免重設圖片大小
重設圖片大小是指在頁面、CSS、JavaScript等中多次重置圖片大小,多次重設圖片大小會引發圖片的多次重繪,影響性能。 -
圖片盡量避免使用DataURL
DataURL圖片沒有使用圖片的壓縮算法文件會變大,並且要解碼后再渲染,加載慢耗時長。 -
圖片懶加載
圖片對頁面加載速度影響非常大。比如,當一個頁面內容比較多的時候,加載速度就會大大的降低,極大的影響到用戶體驗 。更有甚者,一個頁面可能會有幾百個圖片,但是頁面上僅僅只顯示前幾張圖片,那其他的圖片是否可以晚點加載用於提高性能。具體可見 >>
JavaScript相關優化
-
把腳本放在頁面底部
放在前面js加載會造成阻塞,影響后面dom的加載 -
使用外部JavaScript和CSS
在現實環境中使用外部文件通常會產生較快的頁面,因為 JavaScript 和 CSS 有機會被瀏覽器緩存起來。對於內聯的情況,由於 HTML 文檔通常不會被配置為可以進行緩存的,所以每次請求 HTML 文檔都要下載 JavaScript 和 CSS。所以,如果 JavaScript 和 CSS 在外部文件中,瀏覽器可以緩存它們,HTML 文檔的大小會被減少而不必增加 HTTP 請求數量。 -
壓縮JavaScript和CSS
壓縮文件是為了降低網絡傳輸量,減少頁面請求的響應時間。 -
減少DOM操作
操作dom會產生幾種動作,極大的影響渲染的效率。其中layout(布局)和paint(繪制)是最大的。 -
js開銷縮短解析時間
開銷:加載-》解析和編譯-》執行
js的解析和編譯,執行要花很長時間(谷歌開發工具中的performance中可以查看。選中main主線程中的某一段。)
解決方案:- 代碼拆分按需加載
- tree shaking代碼減重
- 避免長任務
- requestAnimationFrame和repuestIdleCallback進行時間調度
-
v8編譯原理(代碼優化)
- 解析js代碼成抽象語法樹-》字節碼-》機器碼
編譯過程會進行優化
運行時可能會發生反優化 - v8內部優化
腳本流:邊下載邊解析
字節碼緩存:常用的字節碼會存起來(這個文件用到其他的文件也用到的參數)
函數懶解析:先解析用到的 - 對象優化(迎合v8進行優化)
保證對象初始化順序一致(對象初始化時v8會生成隱藏屬性以便后續復用並且是按照順序排序的)
不要直接賦值對象新屬性(追加的屬性需要通過描述數組間接查找)
使用數組代替類數組(v8會對數組進行優化)比如先將類數組轉化成數組
避免讀取數組越界(比如for循環多查找1個下標會照成性能相差6倍)
- 解析js代碼成抽象語法樹-》字節碼-》機器碼
造成undefined和數字比較
數組也是對象,當找不到對應下標的時候回沿着原型鏈向上找造成額外開銷
業務上無效
- js內存,避免造成內存泄漏
通過變量是否能被訪問到來判斷內存是否釋放。
- 局部變量: 函數執行完沒有閉包引用會被標記回收
- 全局變量: 直到瀏覽器被卸載頁面釋放
- 回收機制:
引用計數:每調用一次加一,當計數為0的時候進行回收。缺點是不能解決循環引用(例如a對象依賴於b對象,標記清除(垃圾回收): 從根節點去訪問,當訪問到不能被訪問的對象就進行標記然后進行垃圾回收。(當a對象
解決:避免意外的全局變量;避免反復運行引發的閉包;避免脫離的dom元素沒有被回收(所以react有ref這個api)。
CSS 相關優化
- 把樣式表放在標簽中
css放在head標簽中比css放在body標簽尾部少了一次構建RenderTree, 一次計算布局和一次渲染網頁, 因此性能會更好。 - 不要使用CSS樣式表
- 使用替代@import
- 不要使用filter
- 避免元素類型轉化(數組中放多種類型不利於v8引擎優化代碼)
- 降低css對渲染的阻塞(按需加載,放在dom前面加載)
- 利用pu完成動畫(前面講到的復合)
- 使用contain進行優化(優化強度大。例如: contan:layout告訴瀏覽器這個節點內部的子元素和外面的使用font-display進行優化:讓文字更早的顯示在頁面上,減輕文字閃動的問題
html 相關優化
- 減少iframes使用
- 壓縮空白符
- 避免嵌套層次太深
- 避免使用table布局
- 減少沒必要的注釋
- 刪除元素默認屬性(比如默認checkbox等)
開發內容相關優化
- 減少HTTP請求數
- 減少DNS重定向
- 緩存AJax請求
- 延遲加載
- 預加載
- 減少DOM元素的數量
- 划分內容到不同域名
- 盡量減少使用iframe
- 避免404錯誤
服務器相關優化
- 使用CDN
- 添加Expires或Cache-Control響應頭
- 啟用Gzip
- 配置Etag
- 盡早輸出緩沖
- Ajax請求使用GET方法
- 避免圖片src為空
- 傳輸加載優化
服務器啟用gzip - keep Alive(持久TCP連接)
keepalive_requests 100;請求100次后開啟http的keepAlive有keepalive_timeout 65;65秒后關閉。 - http緩存
最好是用no-cache(要用的時候需要在服務器那邊Etag驗證下) - service workers
- 加速重復訪問
- 離線支持
Cookie相關優化
- 減少cookie大小
- 靜態資源使用無cookie域名
首屏加載優化
- 資源壓縮、傳輸壓縮、代碼拆分、tree shaking、http緩存
- 路由懶加載、預渲染、inlineCss、虛擬列表
- prefetch和preload調整加載順序js內存管理
