體驗評分 Audits 是微信開發者工具內置的一項功能,會在小程序運行過程當中實時檢查,分析出一些可能致使體驗很差的地方,而且定位出哪裏有問題,以及給出一些優化建議。html
京喜小程序做爲京東戰略級業務,擁有千萬級別的流量入口,通過長時間的業務迭代,代碼邏輯已經十分複雜臃腫,有迫切的性能優化需求。所以,結合體驗評分功能,以京喜首頁作試點,咱們進行了一次體驗評分的優化實踐。目的是探索小程序體驗評分的指標原則:拿到100分的小程序應該是什麼樣子的;同時但願藉此給項目優化提供更多思路。前端
我會按照「瞭解首頁評分現狀,分析扣分項規則,解決扣分項」這個思路來介紹,就讓咱們開始吧~web
打開小程序開發者工具-調試器-Audits,點擊運行,操做頁面滾一滾點一點,而後點擊結束。小程序
評分結果會根據評測頁面內容差別、操做習慣、有無緩存有必定浮動,下圖是京喜首頁的一次評分:總分68,性能、體驗、最佳實踐都有扣分,合計8項扣分項,後面咱們來逐條分析這些扣分項。數組
得分標準:頁面 WXML 節點少於 1000 個,節點樹深度少於 30 層,子節點數不大於 60 個。瀏覽器
頁面節點指標的意義在於,過大的節點數,過多過深的節點組成,都會增長內存使用,樣式重排時間更長,影響體驗。緩存
現有節點2500+,想要進行優化,首先須要瞭解頁面各個模塊的節點數分佈。性能優化
如何統計每一個模塊的節點數呢?可使用「控制變量法」,利用性能評測工具中,節點數超過1000時會列出節點總數的能力,咱們能夠在總指標超過1000的狀況下,每次隱藏一個模塊:微信
目標模塊節點數 = 原總節點數 - 當前節點數 網絡
(實測節點數會有小範圍浮動,能夠測3次取平均值)
首頁的模塊分析圖以下:
(第一屏) (第二屏)
簡化數據以下:
觀察列表能夠獲得兩個信息:首頁分爲展現狀態互斥的第一屏和第二屏;列表模塊的節點數是大頭。
所以,咱們獲得優化的兩個方向:
第一個優化項能夠經過變量控制組件顯示隱藏,按需加載卸載。
第二個優化項首先想到的是減小列表接口分頁數值,好比一次請求20條數據改成請求5條。可是若是接口不支持自定義分頁,還能夠實現更小的分頁拉取嗎?
那就本身寫一個分頁方法的代理吧~
思路以下:
上方爲原始請求,每次20條數據,下方爲代理請求的實現,每次返回5條。灰色虛線框是真實的請求數據動做,經過維護一個全量數據,須要哪頁取哪頁,這是示例代碼:
經過以上兩個優化,能夠成功的把首頁的頁面節點數瘦身一下了,最後咱們成功達到 wxml 節點總數不大於1000的目標。
得分標準:圖片寬高乘積 <= 實際顯示寬高乘積 * (設備像素比 ^ 2)
簡單理解是圖片尺寸太大而展現尺寸過小,致使浪費網絡請求時間和內存資源。
解決方案:cdn服務商通常都支持經過參數獲取不一樣尺寸的圖片,前端能夠包裝一個公共方法,根據頁面元素尺寸拉取合適大小的圖片。
此外,補充一下圖片體積的內容,除了關注圖片尺寸,具體的體積大小其實更值得關注,有如下兩個點能夠了解下:
這張圖裏未考慮 webp,加上 webp 其餘類型競爭力瞬間不足了,移動端 androd 支持率基本可用,能夠考慮根據設備類型漸進式使用:
得分標準:可點擊元素的寬高都不小於 20px
移動端操做全靠手指,太小的交互區域會帶來很差的體驗,能夠經過增大元素響應熱區的方式來優化,如下方式均可以:
padding
border
box-shadow
得分標準:3 分鐘之內同一個url請求不出現兩次回包大於 128KB 且如出一轍的內容
這一項的理由是,發起網絡請求總會讓用戶等待,可能形成很差的體驗,應儘可能避免多餘的請求,好比對一樣的請求進行緩存。
優化方式:
得分標準:經過wx.request
發起的耗時超過 300ms 的請求併發數不超過 10 個。
不一樣於上一項,這一項關注的是接口併發數:
wx.request
(HTTP 鏈接)的最大併發限制是 10 個wx.connectSocket
(WebSocket 鏈接)的最大併發限制是 5 個優化方式:
得分標準:setData
傳入的全部數據都在模板渲染中有相關依賴
這一項考察的是 data 冗餘的問題,小程序設計了渲染和邏輯分離的雙線程,兩邊通信經過 evaluateJavascript
轉換字符串再進行拼接實現,須要很是當心兩個線程之間通信的數據量。所以,未綁定wxml的變量,最好優化成不使用 setData
。
根據使用場景,能夠作的優化有:
this.privateData
對象setData
方法,具體用法參見文檔:https://developers.weixin.qq....可是,若是你像我同樣遇到上面策略沒法覆蓋的場景呢?
那麼還有一個終極 hack 的方法:
這樣 list 會被判斷爲有綁定節點,就不會扣分了
得分標準:同域名耗時超過 100ms 的圖片請求併發數不超過 20 個
最後這一項也是圖片相關,發起太多圖片請求會觸發瀏覽器並行加載的限制,可能致使圖片加載慢,用戶一直處於等待中。
優化方式:
Image
組件支持經過配置 lazy-load
參數來實現懶加載(https://developers.weixin.qq.... ),具體斷定邏輯是圖片進入上下三屏就開始加載。若是須要更可控的實現,能夠本身構建組件來處理。作完這些優化,再測一下體驗評分:
以上就是京喜首頁在小程序體驗評分優化方面進行的實踐內容了。
總結一下,小程序性能評分能夠從指標和實際數據上給咱們的項目優化提供一些建議,本文主要從評分角度去分析了各類優化可能,但願能爲各位小程序開發者帶來參考價值。
[1] 小程序開發文檔:https://developers.weixin.qq....
[2] Images: Your easiest page speed win: https://searchengineland.com/...
[3] Tiny Png: https://tinypng.com/
歡迎關注凹凸實驗室博客:aotu.io
或者關注凹凸實驗室公衆號(AOTULabs),不定時推送文章。