前幾日做者在掘金上看到了【微信小程序性能優化】這篇文章,當時心想這個團隊作的事情和咱們方向很類似,仔細一看原來是微信公開課上小程序專場中「小程序性能優化」模塊的記錄,而其中咱們提出的建議(獨立分包)也即將發佈。藉着這個機會,咱們也決定把在掃碼付小程序中的一些優化實踐分享出來。前端
美團掃碼付小程序是一款面向C端消費者推出的線下收單業務。它寄託在美團小程序下,在實際場景中,用戶先使用微信掃一掃掃描商家二維碼,接着調起掃碼付小程序,進入支付頁後輸入金額向商家完成商品支付。json
咱們一直在作一件事情:提高掃碼付小程序的支付轉化率。這裏所提的支付轉化率指:整個業務流程中用戶成功支付到掃碼的佔比。支付轉化率與掃碼付業務來說,百分比越高,掃碼付業務的營業額收入越高,帶來的收益是成正比的。而這部分轉化率流失的影響,咱們認爲包含兩個部分:小程序
在掃碼到進入小程序環節,微信會完成小程序基本信息獲取、資源準備(代碼下載或更新)等準備事項,在準備事項中若準備失敗或時間過長會致使用戶手動離開,這部分由微信控制的環節稱之爲外部環節;在進入小程序到支付環節,頁面會進行渲染、數據請求等,若是渲染時間長、數據請求時間長也易致使用戶手動離開,而數據請求失敗也會形成用戶使用流程終止而離開,這部分由咱們本身控制的環節稱之爲內部環節。微信小程序
對於小程序開發者而言,掃碼到小程序調起這個環節是黑盒的,咱們沒法得知此處的細節。而咱們在掃碼付小程序中嘗試和微信的同窗作了一次梳理,發現掃碼付小程序在外部環節的丟失率較高,查詢數據發現其中大部分用戶手動點擊了右上角的退出。從業務出發,用戶使用掃碼付能夠認爲用戶是有強需求進行支付,可以形成用戶手動點擊退出的行爲部分緣由可能來自於等待時間較長,而在這個環節對時間形成影響更多的是資源準備,即小程序代碼下載或者更新的行爲。緩存
影響下載和更新時間可能的因素有:性能優化
用戶網絡是咱們沒法控制的,只能嘗試從代碼包開始下手。而在當時未使用分包的狀況下,咱們的主包大小約3M,意味着新用戶和無緩存小程序用戶均須要在首次使用時等待下載3M左右的包大小,在這種狀況下雖然用戶享受了小程序離線緩存包的福利,卻丟失了大部分新用戶的體驗。因而咱們嘗試從包代碼大小作了一些優化:微信
在作了這些事情後,掃碼付分包從原先的整包3M縮減到了361k(主包300k+分包61),而外部環節的轉化率也提高了3%。雖然轉化率提高了,但前置環節的轉化率仍然有部分丟失,理論上繼續縮減300k的主包能有效提高,但因爲業務性質的緣由沒法再繼續縮減,因而咱們向微信小程序提出了獨立分包的概念:用戶在使用獨立分包時無需下載主包。經過獨立分包加載,程序使用期間下載更新階段只須要加載61k的分包大小,目前這個功能還在內測階段,掃碼付小程序也在做爲第一批的內測用戶進行體驗,優化效果在以後的實踐中咱們也會分享出來。網絡
在進入小程序到支付這個環節,屬於咱們的業務流程。在這個環節中的轉化率丟失雖然是咱們能掌控的,但咱們並沒有頭緒,因此咱們作了一些數據監控來尋求方法:app
異常監控。頁面的任何異常均可能致使支付頁面的渲染失敗,從而沒法正常支付。咱們對頁面的接口異常、微信API異常進行了監控。接口異常可在API(wx.request)的fail函數中直接捕獲,從而上報監控;對於接口超時,則只能經過全局的app.json進行全局設置(默認60s,時間過長,對用戶體驗較差),此前咱們曾嘗試在小程序中設置全局的5s請求超時,但實際應用中並不是全部場景須要設置統一的超時,最終咱們單獨封裝了接口請求超時。微信API的異常經過微信的一些fail中進行監控便可。函數
性能監控。小程序內部轉化環節中關注進入小程序後的白屏時間和可交互時間。內部白屏時間從onLoad處打點,到頁面onReady處結束;內部可交互時間從onLoad處打去kjnpl0o09o0點,到頁面數據請求結束後的可點擊支付時間截止。
平常監控中,咱們也發現了一些問題,例如接口調用超時、接口調用失敗,這些問題會致使頁面流程終止。針對這些問題,作了一些優化:
對於這兩類異常,在接口超時、調用失敗時採起重試。而爲了不在極端狀況下服務端流量陡增、峯值倍數增長,頁面的可重試次數會在前置獲取全局配置時根據「可重試次數」控制,而且每次重試須要在一段時間後用戶手動觸發。超太重試次數時,則流程終止。
前面咱們也提到,對於小程序開發者而言,掃碼到小程序調起這個環節是黑盒的,咱們開發者沒法得知此處的細節,因此說在監控外部環節這方面咱們開發者彷佛可作的事情屈指可數。可是,不知道細心的同窗有沒有發現,微信在每次掃碼後會給咱們在query參數上附帶一個scancode_time字段。其實這個字段表示的是用戶在使用掃一掃時微信服務端記錄的時間,因此基於這個字段的考量,咱們作了以下嘗試,針對如下兩個參數值分別作了實時監控:
Tips:因爲客戶端的時間戳是獲取本地手機系統的時間,可能存在差別。因此爲了保證上報的準確性,咱們在每次onLoad的時候取了一次咱們服務端的時間,記錄了客戶端的時間與服務端的一個時間差額,而且在後續全部涉及到服務端的時間都參照這個時間差額作計算(網絡100-200ms級別的傳輸時延暫可忽略)
但因爲咱們掃碼付小程序的特殊應用場景就是爲了保障用戶進行快速可靠的支付,既然在外部環節可控度不高,那是否是能夠考慮在內部的業務流程方面把監控統計作的細粒度一點,作到能對每個可能影響到支付的環節有數據可循呢?因此咱們針對這個方向,區別於傳統的pv、uv統計,對業務上報作了以下分類:
基於上述方案的探索,咱們小組基本上作到了對可能影響支付環節的某些業務指標的把控。從而在下一步,能夠針對每一個潛在的可優化點作進一步思考與考量,做出及時的策略優化與更新。
經過對掃碼付小程序的探索,咱們積累了比較寶貴的優化經驗,不過對於能優化的方面,還須要咱們更進一步探索,距離咱們的目標還很遠。固然若是你有興趣,咱們更但願你能加入咱們,一塊兒探索將來。因此這裏呢也打個廣告,對咱們「智能支付大前端團隊」有興趣的同窗可直接簡歷發送給陳小二同窗(chenyao05@meituan.com)。