W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
與傳統(tǒng)的 H5 應(yīng)用不同,小程序運行架構(gòu)分為 webview 和 worker 兩個部分。webview 負(fù)責(zé)渲染,worker 則負(fù)責(zé)存儲數(shù)據(jù)和執(zhí)行業(yè)務(wù)邏輯。
首屏有多種定義,這里的首屏是指業(yè)務(wù)角度第一次有意義的渲染。比如: 對于列表頁,首屏就是列表第一次渲染出的內(nèi)容。
當(dāng)用戶訪問一個小程序時,支付寶客戶端會首先從 CDN 下載小程序資源包,所以資源包的大小會影響小程序啟動性能。
優(yōu)化建議
部分小程序會在 onReady 中發(fā)出請求,導(dǎo)致首屏渲染延緩。
優(yōu)化建議 將數(shù)據(jù)請求提前到 onLoad 中。
業(yè)務(wù)請求返回后,通常會調(diào)用 setData 觸發(fā)頁面重新渲染。執(zhí)行過程如下:
由于 worker 與 webview 通信時,數(shù)據(jù)需要序列化,然后到了 webview 需要執(zhí)行 evaluateJavascript,因此如果一次性傳輸數(shù)據(jù)太大,會影響首屏渲染性能。
另外,如果 webview 上構(gòu)造節(jié)點過多,層級嵌套太深,例如有的小程序列表頁面一次性渲染超過 100 個列表項,每個列表項又有嵌套內(nèi)容,而實際上整個屏幕可能只是顯示不到 10 個, 會導(dǎo)致差異比較時間較長,同時由于是首屏渲染,會一次性構(gòu)造很多 DOM,影響首屏渲染性能。
優(yōu)化建議
任何頁面變化都會觸發(fā) setData,同一時間可能會有多個 setData 觸發(fā)頁面進(jìn)行重新渲染。如下四個接口都會觸發(fā) webview 頁面重新渲染。
優(yōu)化建議
優(yōu)化案例
推薦指定路徑設(shè)置數(shù)據(jù):
this.setData({
'array[0]': 1,
'obj.x':2,
});
不推薦如下用法(雖然拷貝了this.data, 仍然直接更改了其屬性):
const array = this.data.array.concat();
array[0] = 1;
const obj={...this.data.obj};
obj.x=2;
this.setData({array,obj});
更不推薦直接更改 this.data(違反不可變數(shù)據(jù)原則):
this.data.array[0]=1;
this.data.obj.x=2;
this.setData(this.data)
長列表使用 $spliceData:
this.$spliceData({ 'a.b': [1, 0, 5, 6] })
注意
有時業(yè)務(wù)邏輯封裝到了組件中,當(dāng)組件 UI 需要重新渲染時,只需在組件內(nèi)部調(diào)用 setData。但有時需要從頁面觸發(fā)組件重新渲染,比如在頁面上監(jiān)聽了 onPageScroll 事件,當(dāng)事件觸發(fā)時,需要通知對應(yīng)組件重新渲染,此時的處理措施如下所示:
// pages/index/index.js
Page({
onPageScroll(e) {
if (this.xxcomponent) {
this.xxcomponent.setData({
scrollTop: e.scrollTop
})
}
}
})
// components/index/index.js
Component({
didMount(){
this.$page.xxcomponent = this;
}
})
可在組件的 didMount 中將組件掛載到對應(yīng)的頁面上,即可在頁面中調(diào)用組件級別的 setData 只觸發(fā)組件重新渲染。
在 for 中使用 key 來提高性能。 注意 key 不能設(shè)置在 block 上。
示例代碼:
<view a:for="{{array}}" key="{{item.id}}"></view>
<block a:for="{{array}}"><view key="{{item.id}}"></view></block>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: