小程式基礎庫升級後引起jsEnginScriptError e.page.__callPageLifeTime__ is not a function

MiWi銳霸發表於2019-03-08

背景

最近一個比較久沒迭代的公司小程式,出現了只顯示首頁,其他頁面都空白的情況。起初開發者工具中模擬器正常,真機上出現問題,後切換基礎庫後,模擬器上覆現了問題。所以判斷系基礎庫更新引起的相容問題。

錯誤提示如下

錯誤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都不會出現上述錯誤。

相關文章