企業微信端產品「C端用戶小程序」,是一款服務於vivo線下代理、門店和導購,幫助導購鏈接用戶,快速與用戶進行溝通的工具。基於「C端小程序」的PU/UV量較爲龐大,爲了更加極致的用戶體驗,因此提高小程序性能優化是必然。javascript
存量用戶運營企業微信「用戶端小程序」主要是服務於vivo代理、線下門店和導購,幫助導購鏈接用戶的工具。html
看下「用戶端小程序」的「新用戶註冊」,「新機預售」的頁面,以下:java
vivo新用戶註冊 web
一圖勝千言,看下存量用戶運營「用戶端小程序」在沒作優化以前,從「小程序數據助手」中獲取到的「代碼包下載量,打開耗時分佈,網絡請求延遲,網絡流量消耗」等數據。以下:小程序
從圖中咱們能夠看到,下載小程序代碼包主要集中在2-5秒,此外,部分http請求接口的時間延遲很長,會影響到總體頁面的渲染效果。因而可知,存量用戶運營「用戶端小程序」還有很大的優化空間。後端
單純的快是不行的。咱們不該該單純考慮速度指標而忽略用戶的感知體驗,而應該全方位衡量用戶在使用過程當中能感知到的與應用加載相關的每一個節點。promise
FCP:白屏加載結束瀏覽器
FMP:首屏渲染完成緩存
TTI:全部內容加載完成性能優化
小程序官方指標:
- 首屏時間不超過 5 秒。
- 渲染時間不超過 500ms。
- 每秒調用 setData 的次數不超過 20 次。
- setData 的數據在 JSON.stringify 後不超過 256kb。
- 頁面 WXML 節點少於 1000 個,節點樹深度少於 30 層,子節點數不大於 60 個。
- 全部網絡請求都在 1 秒內返回結果。
存量用戶運營」用戶端小程序「須要達到的指標:
- 首屏時間不超過 2.5 秒。
- setData 的數據量不超過 100kb。
- 全部網絡請求都在 1 秒內返回結果。
- 組件滑動、長列表滾動無卡頓感。
小程序的最終渲染載體依然是瀏覽器內核,而不是原生客戶端。啓用了雙線程模型:
- 視圖層:也就是webview線程,負責啓用不一樣的 webview 來渲染不一樣的小程序頁面。
- 邏輯層:一個單獨的線程執行 JS 代碼,能夠控制視圖層的邏輯。
1. 準備運行環境。
小程序基礎庫包括 WebView 基礎庫和 AppService 基礎庫,前者注入到視圖層中,後者注入到邏輯層中,分別爲所在層級提供其運行所需的基礎框架能力。
2. 下載小程序代碼包。
3. 加載小程序代碼包。
在頁面註冊過程當中,基礎庫會調用頁面 JS 文件的 Page 構造器方法,來記錄頁面的基礎信息(包括初始數據、方法等)。
4. 初始化小程序首頁。
(ps:小程序開發者工具的評分插件audits能夠對小程序的性能,使用體驗,實踐,UI樣式,http請求等多個維度進行綜合評分,建議小程序開發者在項目開發中使用。)
方案1:無用的文件,函數,wxss樣式剔除,不須要的import砍掉。
方案2:減小代碼包中的靜態資源文件。
除了部分圖片必須放在代碼包(譬如網絡異常提示)以外,建議開發者把圖片、視頻等靜態資源都放在 CDN 上。
方案3:邏輯後移,精簡業務邏輯。
儘可能把業務邏輯寫在後端,若是一旦出現線上問題,小程序發版須要騰訊審覈,然後端能夠及時發佈代碼。
方案4:分包加載與分包預下載。
方案5:部分頁面h5化。
小程序的白屏階段:小程序代碼包下載完(也就是啓動界面結束)以後,頁面完成首屏渲染的這一階段,也就是 FMP (首次有效繪製)。
影響白屏的兩個因素:
方案1:啓用本地緩存。
方案2:跳轉頁面時預拉取。
(ps:在A頁面onHide或者onUnload的時候經過promise請求下一個頁面B頁面的http接口,在B頁面onload或者onShow的時候從promise中獲取數據。)
方案3:非關鍵渲染數據延遲請求。
方案4:分屏渲染。
方案5:骨架屏。
方案6:限制http請求數量。
方案7:圖片資源優化。
概念:當調用 wx.navigateTo 打開一個新頁面時,小程序框架會完成如下幾步:
小程序的渲染損耗主要在數據通訊和節點樹建立及更新的流程中,提高渲染性能優化的方向:
方案1:合併setData調用。
儘量地把屢次setData調用合併成一次。
只把與界面渲染相關的數據放在Data中。
方案2:去掉沒必要要的事件綁定。
沒必要要的click、touch、onPageScroll不要被觸發。
方案3:去掉沒必要要的節點屬性。
組件節點支持附加自定義數據 dataset,當用戶事件被觸發時,視圖層會把事件 target 和 dataset 數據傳輸給邏輯層。以下例:
<view class="tabbar-item" wx:for="{{list}}" wx:key="index" item="item"> <view @tap="tabFn" data-index="{{item}}"> </view> </view> methods = { tabFn (e) { const item = e.currentTarget.dataset['item']; console.log(item); } };
自定義數據量越大,事件通訊的耗時就會越長,因此儘可能減小自定義數據量,或者不用自定義數據。
當小程序佔用系統資源太高,就有可能會被系統銷燬或被微信客戶端主動回收,致使小程序掛掉。
方案1:回收頁面的setTimeout和setInterval計時器。
小程序每個頁面都會獨立一個 webview 線程,但邏輯層是單線程的,也就是全部的 webview 線程共享一個 JS 線程,以致於跳轉頁面,計時器還在跑。
onHide或者onUnload的時候清除計時器。
方案2:避免頻發事件中的重度內存操做。
優化以前得分以下:
優化以後得分以下:
因而可知,按照以上步驟作小程序性能優化以後,audis的綜合評分是有一個明顯的進步的。
小程序性能優化和H5優化同樣,是一個根據多樣性用戶場景作持續迭代的過程,也是咱們平常作web開發揮之不去的原則和主題。本文探討了小程序優化的各類場景和方案,但願在之後的項目開發過程當中,可以持續優化,打造出更好的產品。
做者:vivo-Fu Weilang