一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

商城系統(tǒng) 注冊

小程序redux性能優(yōu)化,提升三倍渲染速度

2020-09-27|HiShop
導讀:很多使用小程序的用戶會反饋,一些小程序會出現卡頓的情況,比如一些電商小程序在打開商品列表需要幾秒的緩沖時間,那么微信小程序開發(fā)需要如何優(yōu)化,下面是這篇小程序redux性能優(yōu)化。...

很多使用小程序的用戶會反饋,一些小程序會出現卡頓的情況,比如一些電商小程序在打開商品列表需要幾秒的緩沖時間,那么微信小程序開發(fā)需要如何優(yōu)化,下面是這篇小程序redux性能優(yōu)化。

首先了解小程序的工作原理和性能關鍵點。

小程序redux性能優(yōu)化,提升三倍渲染速度

1工作原理 (官方說明)

小程序的視圖層目前使用 WebView 作為渲染載體,而邏輯層是由獨立的 JavascriptCore 作為運行環(huán)境。在架構上,WebView 和 JavascriptCore 都是獨立的模塊,并不具備數據直接共享的通道。當前,視圖層和邏輯層的數據傳輸,實際上通過兩邊提供的 evaluateJavascript 所實現。即用戶傳輸的數據,需要將其轉換為字符串形式傳遞,同時把轉換后的數據內容拼接成一份 JS 腳本,再通過執(zhí)行 JS 腳本的形式傳遞到兩邊獨立環(huán)境。 
而 evaluateJavascript 的執(zhí)行會受很多方面的影響,數據到達視圖層并不是實時的。

2性能關鍵點(官方說明)

  1. 頻繁的去 setData 
    在我們分析過的一些案例里,部分小程序會非常頻繁(毫秒級)的去setData,其導致了兩個后果:

Android 下用戶在滑動時會感覺到卡頓,操作反饋延遲嚴重,因為 JS 線程一直在編譯執(zhí)行渲染,未能及時將用戶操作事件傳遞到邏輯層,邏輯層亦無法及時將操作處理結果及時傳遞到視圖層; 
渲染有出現延時,由于 WebView 的 JS 線程一直處于忙碌狀態(tài),邏輯層到頁面層的通信耗時上升,視圖層收到的數據消息時距離發(fā)出時間已經過去了幾百毫秒,渲染的結果并不實時;

  1. 每次 setData 都傳遞大量新數據 
    由setData的底層實現可知,我們的數據傳輸實際是一次 evaluateJavascript 腳本過程,當數據量過大時會增加腳本的編譯執(zhí)行時間,占用 WebView JS 線程,
  2. 后臺態(tài)頁面進行 setData 
    當頁面進入后臺態(tài)(用戶不可見),不應該繼續(xù)去進行setData,后臺態(tài)頁面的渲染用戶是無法感受的,另外后臺態(tài)頁面去setData也會搶占前臺頁面的執(zhí)行。

3度量性能指標

我們在優(yōu)化性能時,指標是非常重要的,沒有指標,你沒法知道優(yōu)化的點是否有效。不能單憑感覺去優(yōu)化,要根據指標反饋,明確優(yōu)化的成果。同時,優(yōu)化就像個無底洞,要注意投入產出比。 
用戶反饋的卡頓,要么就是js執(zhí)行消耗資源過多導致處理器沒響應,要么是UI渲染消耗資源過多,導致UI沒法響應用戶操作。 
通過查看代碼,我們并沒有消耗大量計算資源的業(yè)務邏輯,但是出現了UI反復操作和搶占資源的現象。

4如何度量

可以利用setData的第二個參數,傳入callback函數,統(tǒng)計渲染時長。代碼如下


  1. let startTime = Date.now()
  2. this.setData(data, () => {
  3. let endTime = Data.now()
  4. console.log(endTime - startTime, '渲染時長')
  5. })

案例分析  1、檢查點:是否頻繁去setData  檢查結果:存在  產生原因:redux中監(jiān)聽的是整個store,只要store變化,就會執(zhí)行setData操作,這就意味著頁面無關的數據改變,也會觸發(fā)該頁面執(zhí)行setData操作,但是這個操作是無意義的。  問題代碼:


  1. // libs/redux-wechat/connect.js
  2.  
  3. // 對整個store進行subscribe。變化就執(zhí)行handleChange
  4. this.unsubscribe = this.store.subscribe(handleChange.bind(this, options));
  5.  
  6. function handleChange(options) {
  7. ...省略代碼
  8. const state = this.store.getState()
  9. const mappedState = mapState(state, options);
  10. this.setData(mappedState)
  11. }

解決方案:

只監(jiān)聽當前頁面用到的store中的部分數據,只有該部分數據變化,才setData。(store沒提供單個數據的監(jiān)聽,如果自己修改redux實現,難度較大,同時修改太底層,容易出不可預料的異常。)  判斷頁面數據與需要更新數據是否相同,如果相同,不做操作。(這個方案成本比較低,就用它吧)

代碼實現:


  1. // libs/redux-wechat/connect.js
  2. // 如果更新的數據和頁面數據相同,不做操作。
  3. function handleChange(options) {
  4. ...省略代碼
  5. const state = this.store.getState()
  6. const mappedState = mapState(state, options);
  7. // 如果更新的數據和頁面數據相同,不做操作。
  8. if (mappedState === this.prevState) return // 新加入代碼
  9. this.setData(mappedState)
  10. // 保存上一次數據
  11. this.prevState = mappedState // 新加入代碼
  12. }

另外一個優(yōu)化:如果store數據毫秒級變化怎么辦,例如更新購物車的同時,還更新了購物數量,能不能把兩次變化合并起來?因為store的數據是共享的,最后一次的更新就是最新的數據,可以采用節(jié)流器對請求進行合并。


  1. clearTimeout(this.setDataTMO)
  2. this.setDataTMO = setTimeout(() => {
  3. this.setData(mappedState)
  4. }, 50); // 時間可以看情況調整

2、檢查點:每次 setData 都傳遞大量新數據  檢查結果:存在  產生原因:

頁面存在引用沒用到的store數據。  后端返回數據直接進入store,后端接口返回冗余字段。

問題代碼:


  1. /pages/user/index.js
  2. connect(state => ({
  3. member: state.member,
  4. mycoupon: state.mycoupon,
  5. guessLikeList: state.recommend.guessLikeList,
  6. locationInfo: state.common && state.common.locationInfo, //可刪除
  7. selectedseller: state.home.selectedseller,//可刪除
  8. carts: state.carts.carts,//可刪除
  9. ...state.common
  10. }))

解決方案:

刪除頁面無用的connect (老業(yè)務在使用,修改存在風險,通過后續(xù)迭代優(yōu)化)  請求后端接口后,拿到數據進行優(yōu)化處理再把數據傳入store(成本較高)

3、檢查點:后臺態(tài)頁面進行 setData  檢查結果:存在  產生原因:redux connect設計與小程序有差異  問題代碼:


  1. // libs/redux-wechat/connect.js
  2. function onLoad(options) {
  3. ...省略部分代碼
  4. if(shouldSubscribe){
  5. this.unsubscribe = this.store.subscribe(handleChange.bind(this, options));
  6. handleChange.call(this, options)
  7. }
  8. }
  9. function onUnload() {
  10. ...省略部分代碼
  11. // 頁面onUnload時,才解除監(jiān)聽
  12. typeof this.unsubscribe === 'function' && this.unsubscribe()
  13. }

小程序生命周期中,onUnload會在頁面銷毀時執(zhí)行,例如A->B->C->D 的跳轉,A頁面一直在監(jiān)聽store的變化,如果D頁面修改數據,會造成A,B,C頁面也執(zhí)行setData操作,搶占了D的資源,因此造成卡頓。  解決方案:

后臺狀態(tài)的頁面在setData時直接return(目前采用該方法)  當頁面隱藏時,移除監(jiān)聽。

代碼實現:


  1. // 因為在后臺的頁面setData會搶占前臺資源,所以在后臺的頁面不要執(zhí)行setData操作
  2. if (this.route !== _getActivePage().route) return

但是由于在后臺的頁面數據沒法更新,如果D頁面修改A引用的數據,就會出現A引用舊數據問題,所以在onShow的時候做一次同步。


  1. // 后臺的頁面切換到前臺的時候,做一次數據同步
  2. function onShow(options) {
  3. if(shouldSubscribe){
  4. handleChange.call(this, options)
  5. }
  6. if (typeof _onShow === 'function') {
  7. _onShow.call(this, options)
  8. }
  9. }

指標測試  做了這么多,到底有沒用,拿出來溜一溜就清楚了。  測試平臺:iphone7、三星s7 、小程序開發(fā)工具  測試流程:首頁 -> 配送到家 -> 加入購物車 -> 結算 ->查看訂單  測試指標:調用setData次數,渲染總耗時,平均單次渲染耗時

優(yōu)化后setData次數平均下降150次。  渲染耗時越是卡頓的機器,收益越大,三星s7平均每次渲染耗時降低826ms。

HiShop小程序工具提供多類型商城/門店小程序制作,可視化編輯 1秒生成5步上線。通過拖拽、拼接模塊布局小程序商城頁面,所看即所得,只需要美工就能做出精美商城。更多小程序商店請查看:小程序商店

小程序redux性能優(yōu)化,提升三倍渲染速度

 

 

電話咨詢 預約演示 0元開店
主站蜘蛛池模板: 欧美18一19sex性护士浴室|久久99精品久久久久久HB亚瑟|亚洲成在人线免费|超碰五月|久久精品无码一区二区三区不卡|男女拍拍拍拍免费视频 | 国产一区黄|午夜福利国产成人无码GIF动图|骚色综合|国产婬乱=a一级毛片多女|99久久九九国产精品国产免费|久久久久成人精品免费播放动漫 | 一本久久宗合久久伊人|国产精品嫩草研究院|欧美日韩一本|娇小萝被两个黑人用半米长|国产精彩视频一区二区|成年人在线免费看视频 | 少妇天天干|一本久道久久综合中文字幕|色哟哟国产成人精品免费|国产主播户外勾搭人xx|精品无人区无码乱码毛片国产|亚洲欧美中日精品高清一区二区 | 天天操人人插|欧日韩在线|色一区二区三区四区|国产一在线观看|亚洲精品福利片|#NAME? | 日本色七七影院|男女日批视频在线观看|三级网站网址|97视频在线免费观看|天天综合网久久综合免费人成|特黄=a片在线播放免费麻婆豆腐 | 亚洲综合一区在线|日本免费一区二区三区在线播放|亚洲毛片免费观看|国产九色精品|多人调教到高潮失禁h重口视频|亚洲国产精品无码久久九九大片 | 亚洲欧美又粗又长久久久|精品一区二区久久久|亚州精品在线视频|日韩国产成人精品|91=av导航|国产亚州精品视频 | 国产一区二区三区久久悠悠色=av|成人免费视频看看|久久国产精品-国产精品|男人J进女人J啪啪无遮挡|成人片黄网站=a毛片免费|久久精品91视频 | 国产高清精品亚洲а∨|一本久道久久综合狠狠爱亚洲精品|久久国产福利|久久久久www|无码人妻精品一区二区三区99不卡|亚V=a芒果乱码一二三四区别 | 强奷乱码欧妇女中文字幕熟女|中国女人FREE性HD|国产精品一码二码三码在线|少妇性l交大片免费快色|久热=av在线|黑人巨大人精品欧美三区 | 欧美一级爽快片淫片在线观看|大JI巴好深好爽又大又粗视频|日本肉体裸交XXXXBBBB|国产高清二区|日日夜夜操网站|成人www视频 | 精品亚洲永久免费精品鬼片影片|国产色啪午夜免费福利|亚洲国产1区|国产福利不卡|9熟女PRO内射|91精品婷婷色国产综合 | 影音先锋=aV成人资源站在线播放|中文字幕国产在线天堂|国产极品视频在线观看|亚洲毛片儿|人人性人人性碰国产|成人午夜精品久久久久久久蜜臀 | 中文在线日韩|免费高清日本|在线观看免|色就是94综合|日韩=av大片在线|国内精品人妻在线中文字幕 | 一本久久宗合久久伊人|国产精品嫩草研究院|欧美日韩一本|娇小萝被两个黑人用半米长|国产精彩视频一区二区|成年人在线免费看视频 | 99久久无码一区人妻|亚洲第一欧美|欧美一级欧美一级高清|99热这里只有精品9|欧美成人=a猛片在线观看|国产日产欧产美韩系列麻豆 | 喷出高潮国语对白|久久精品视频一区二区|国产高清吃奶成免费视频网站|亚洲视频三级|免费一级黄色|久久综合给合久久狠狠狠97色69 家庭午夜影院|chinese老熟妇老女人hd|欧美成性色|中文字幕无码=a级毛片观看|日本在线观看中文字幕|久久国产精品偷导航 | 阿v天堂2018在无码免费|男人添女人下身视频网站|日韩精品久久久久久免费|日韩爱爱免费视频|视频在线精品一区|成人欧美一区二区三区视频xxx | 91视频网国产|粗大猛烈进出高潮视频|精品国产乱码久久久人妻|亚洲精品无码久久毛片波多野吉衣|成人久久免费视频|国产美女自拍 | j=ap=anese护士高潮|12裸体自慰免费观看网站|免费=a一毛片|欧美人禽zozo动人物杂交|h动漫在线女生向在线精品|狠狠躁夜夜躁人人爽天天2020 | 大胆L少妇BBBBBB流水|欧美操日韩|麻豆视传媒精品=aV|大地资源色婷婷视频在线|亚洲影视一区二区三区|成年男女免费视频在线观看不卡 | 91免费版视频|在线观看人成激情视频|午夜激情视频免费|91麻豆精品国产综合久久久|日韩精品1|夜夜爱视频 | 色综合久久蜜芽国产精品|中国国产精品|国产黄色的视频|风间由美无打码在线观看|欧美日韩国产精品久久久久|最新中文字幕免费视频 | 剑来高清视频在线观看|欧美一区二区日韩一区二区|亚洲欧美日韩成人高清在线一区|国模GOGO无码人体啪啪|加勒比东京热无码国产=aV|亚洲色图在线观看 | 国产最新网站|亚洲美女一区|亚洲V欧美V国产V在线观看|国产精品乱码久久久久久1区2区|大地影视资源在线观看|国产精品扒开腿做爽爽爽日本无码 | 国产做=a爰片久久毛片=a我的朋友|国产精品免费精品自在线观看|石原莉奈视频一区二区|亚洲四区网站|热久久国产视频|久久久久久美女 | 毛片大全|日本色频|亚洲色图偷拍自拍|在线观看片=a免费观看岛国|在线中文字幕-区二区三区四区|日韩欧美色图 | 日本三级韩国三级欧美三级|日韩黄色大片免费看|美国黄色小视频|久久精品国产亚洲=aV麻豆~|中文字幕人成人|一级在线免费 | 免费三级网|看毛片网站|午夜影剧院|国产农村一级一级毛片|十八禁g=ay网站|精品国产乱码久久久久久蜜臀网站 | 国产91视频观看|尤物在线精品视频|真人与拘做受免费视频播放|网站一区二区|色屁屁=av|久久一区二区中文字幕 | 欧洲亚洲综合一区二区三区|99国产精品久久|免费v=a国产高清大片在线|国产成人精品一区二三区在线观看|91麻豆精品国产91|欧美日韩福利视频 | 超清纯白嫩大学生无码网站|97精品人人做人人爱|最新啪啪网站|国产老熟女网站|国产精久久久久久久|久久九九久久 | 艳魔大战4春荡女淫|97超碰免费观看|台湾佬成人网|亚洲性爱视频|无码精品一区二区三区免费视频|国产污视频在线播放 | 亚洲=a级大片|青草伊人久久综在合线亚洲观看|我爱=av网站|91福利视频免费观看|果冻传媒剧国产免费入口今日更新|老师露双奶头无遮挡挤奶视频 | 好男人日本社区www|国产精品乱码一区二三区小蝌蚪|欧亚精品一区|国产欧美在线免费观看|我爱草逼网|乱码专区一卡二卡国色天香 | 青草国产精品久久久久久|公和我做好爽添厨房中文字幕|99re6这里有精品热视频|六月婷婷精品视频在线观看|女教师办公室被强在线播放|日韩一区二区三区不卡视频 | 国产乱人乱精一区二区视频|97性无码区免费|色七七在线|亚洲=aV无码区在线观看东京热|免费看啪啪人=a片=a=a=a片|乱老熟女一区二区三区 | 成全高清视频免费观看|亚欧在线观看视频|天天躁日日躁狠狠躁欧美老妇|性感一级片|日韩一区免费观看|欧美日韩在线免费观看 | 96精品国产|国产图区|亚洲最大=aV网站在线观看|精品一区二区三区影院|久久精品国产99国产|1024免费看 | 日韩精品成人=av|午夜精品一区二区三区免费视频|亚洲精品国产综合久久一线|国产三级=aV在在线观看|GV无码免费无禁网站男男|欧美videos另类极品 |