背景
最近一個比較久沒迭代的公司小程式,出現了只顯示首頁,其他頁面都空白的情況。起初開發者工具中模擬器正常,真機上出現問題,後切換基礎庫後,模擬器上覆現了問題。所以判斷系基礎庫更新引起的相容問題。
錯誤提示如下
錯誤1:啟動首頁後出現,但是首頁正常顯示,因為基本邏輯已經執行完
WAService.js:1 App: onLaunch have been invoked
WAService.js:1 App: onShow have been invoked
WAService.js:1 Register Page: page/tabBar/index/index
WAService.js:1 Register Page: page/tabBar/mine/mine
WAService.js:1 Register Page: page/tabBar/inspiration/inspiration
WAService.js:1 On app route: page/tabBar/index/index
WAService.js:1 Update view with init data
WAService.js:1 page/tabBar/index/index: onLoad have been invoked
VM428:1 jsEnginScriptError
s.__callPageLifeTime__ is not a function;onAppRoute
TypeError: s.__callPageLifeTime__ is not a function
at Ct (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:955103)
at xt (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:956114)
at It (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:957427)
at Function.<anonymous> (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:958295)
at Nt.<anonymous> (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:931964)
at Nt.emit (...
複製程式碼
錯誤2:切換頁面後出現
VM428:1 jsEnginScriptError
e.page.__callPageLifeTime__ is not a function;onAppRoute
TypeError: e.page.__callPageLifeTime__ is not a function
at kt (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:955341)
at http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:957163
at It (http://127.0.0.1:30653/appservice/__dev__/WAService.js:1:957403)
at Function.<anonymous> (...
複製程式碼
分析
以上錯誤提示是模擬器上的錯誤提示,真機上錯誤提示中還有“onShow”或“onHide”欄位,一開始以為是基礎庫要求必須實現onShow/onHide,結果發現不是。回到錯誤1發現應該是在onLoad中就已經掛掉。
onLoad code:
onLoad: function(options) {
this.getData();
wxp.getNetworkType(this);
},
複製程式碼
既然index頁操作顯示正常,那可能問題就在wxp.getNetworkType(this);
,跟蹤發現專案中getNetworkType存在:
- wxPromisify.js 微信SDK api的Promise化
- wxapi.js 微信SDK api的統一處理util,內部function最終呼叫的wxPromisify
wxp對應wxPromisify.js,也就是對應的微信SDK api。
在微信SDK getNetworkType api說明中可以看到接收的Object引數需要的三個屬性均為非必填。
正常情況下不應該有上述錯誤。之前上線也確實沒有錯誤。
wxapi.getNetworkType
這個util function中需要接收正是page context,內部在呼叫wxp.getNetworkType()
不傳參後執行了一些設定網路狀態的操作,不影響原邏輯,於是修改為wxapi.getNetworkType
後,錯誤修復。
結論
在微信基礎庫更新後getNetworkType引數不能傳入page context,但不傳參、傳入{}
、或者傳入指定實現的obj都不會出現上述錯誤。