亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

小程序多圖列表實現性能優化的方法步驟

2020-03-21 15:54:53
字體:
來源:轉載
供稿:網友

寫這篇文章的緣由: 最近在公司的小程序項目中遇到了頁面圖片元素過多導致的性能問題. 從小程序提供的性能檢測面板分析, 確定是圖片元素占用了過多內存導致.

因為本人之前主要是做桌面端應用開發和原生app開發, 沒有太顧及過移動端圖片的內存占用問題. 這次既然遇到了, 也就趁這個機會學習一下其優化的技巧.

什么造成的性能問題

簡單的來說: DOM節點過多 && 圖片節點過多

DOM節點過多會造成更多的內存占用. 按照目前的微信小程序限制, 內存占用500M以上會出現卡頓, 甚至閃退. 如果列表中節點沒有圖片標簽, 內存占用現象還不會太明顯, 只是DOM節點過多會造成頁面渲染耗時增加. 但當列表節點中含有圖片時, 內存占用會迅速攀升.

如何解決這兩點呢?

對于上面兩點, 我們分別有對應的優化思路

1. DOM節點過多.

對于無限加載的頁面, 列表中每一個元素都有大量的子節點. 當列表數目增加時, 頁面的總節點數會暴增. 以小紅書的小程序為例:

小程序,多圖列表,性能優化

上圖中可以看到, 該頁面為很多的卡片組成的列表頁面. 假設一個卡片的DOM子節點數為 30, 那么當列表元素加載到1000時, 頁面會有 30 * 1000 = 30,000 個DOM節點. 小程序顯然是吃不消的 (注: 微信小程序推薦總節點數不超過: 1000)

那我們該如何處理來減少節點數呢?

思路很簡單: 我們可以只對用戶當前屏幕和上下兩屏進行真實內容的加載, 對于其他用戶暫時不可見的地方, 用空白的節點進行占位. 這樣處理后, 實際有內容的卡片數目不超過5個, 頁面的總節點數為: 5 * 30 + 995 = 1145. 相對于之前的節點數有了巨大的改進.

讓我們來看看代碼的實現

寫代碼前, 讓我們整理一下需要的數據結構.

首先這是一個列表頁面, 我們需要一個 List來保存頁面顯示的數據: showCardsshowCards 中只會保存5條真實數據, 其余數據展示以空對象填充.

我們還需要一個保存所有真實數據的List, 這樣當用戶滑動頁面時, 我們才能實時獲取需要顯示的卡片真實數據: totalCards

Page({ showCards: [], totalCards: []})

接下來我們來寫頁面布局部分:

<view wx:for="{{showCards}}"    wx:key="{{index}}">  <self-define-component data-card-data="{{item}}">  </self-define-component>  </view>

簡單的代碼框架就是這樣 (這里省略了很多不影響理解思路的代碼細節)

我們先實現沒有優化DOM節點的代碼邏輯. 在頁面滑動到最底部時, 向showCards push進新的卡片, 并通過 setData 更新頁面. 這樣就實現了一個簡單的下拉無限加載的列表頁面.

async onReachBottom() {  const newCards = await fetchNewCards(); this.data.showCards.push(newCards); this.setData({  showCards: this.data.showCards })},

接下來我們實現優化DOM節點的代碼邏輯. 我們會再用戶滑動頁面(onScroll事件) 時, 對當前頁面每個card 的位置進行判斷, 如果該 card在用戶可見范圍內的上下兩屏內, 則展示真實數據, 否則將其替換為寬高與原卡片一致的空白占位節點.

在 Page 的 onPageScroll 回調中, 我們進行回收函數的調用 (注意這里回調時要進行節流處理, 否則頻繁調用會導致頁面閃動) . 讓我們看看這個回收頁面節點函數的主要邏輯:

回調中, 我們首先通過小程序提供的獲取頁面元素位置的api: createSelectorQuery().boundingClientRect 來拿到每個卡片的位置信息.

接下來, 我們通過位置信息, 判斷是否展示card的真實數據. 對于不展示真實數據的card, 我們需要保存其高度信息, 以便在渲染頁面時使用高度信息填充頁面. 同時我們給空card一個 type 屬性, 方便我們在 wxml中渲染時判斷卡片類型.

async onScrollCallback() { try {  const rectList = await this.calcCardsHeight();  this.recycleCard(rectList); } catch (e) {  console.error(e); }} calcFeedHeight() {  return new Promise((resolve, reject) => {   this.createSelectorQuery()    .selectAll(`.card`)    .boundingClientRect(rectList => {     resolve(rectList);    })    .exec()  }) }, recycleCard(rectList) {  const newShowCards = [];  for (let i = 0; i < this.data.showCards.length; i++) {   const rect = rectList[i];   if (rect && Math.abs(rectList[i].top - 0) > pageHeight * 2) {    newShowCards.push({     type: 'empty-card',     height: rectList[i].bottom - rectList[i].top    });   } else {     const feed = totalCards[i];    newShowCards.push(feed);   }  }  this.setData({   showCards: newShowCards  }); }

接下來, 我們要對wxml布局文件進行相應的修改:

 <view wx:for="{{showCards}}"    wx:key="{{index}}">  <view wx:if="{{item.type === 'empty-card'}}"     class="card empty-card"     style="height: {{item.height}}px">  </view>  <self-define-component wx:if="{{item.type !== 'empty-card'}}"        data-card-data="{{item}}"        class="card read-card">  </self-define-component>   </view>

這樣, 我們就解決了 DOM節點數目過多的問題. 并且最大限度的不影響用戶的體驗. (雖然用戶快速上下滑動時還是會看到一些空白, 但大多數情況用戶不會非??焖俚纳舷禄? 而是閱讀內容并慢速滑動)

2. 圖片節點過多

通過上面一步的優化, 我們其實已經大幅減少了頁面加載的圖片數目. 但是有些情況, 我們的列表中的每一個卡片并不是只有一張圖, 有時我們的圖片組件是一個 swiper. 我們假設每個swiper平均展示10張圖片, 那么我們展示5張card的話,<Image/> 節點就有 50 個. 對于一些低端的安卓機, 這樣的開銷依然會造成卡頓.

那有什么好的優化方案呢? 前面一個問題, 我們的優化思路是在用戶看不見的地方, 將節點簡化展示.

同樣的, 對于swiper控件, 用戶能看到的也就是當前圖片 以及 滑動可見的左右兩張圖片. 其余位置的圖片是可以簡化展示的. 從下圖可以看到, 其實需要立即加載的圖片只有三張. (紅色的框代表的是swiper組件的可視區域)

小程序,多圖列表,性能優化

我們使用一個變量記錄當前swiper控件展示圖片的坐標: curIndex, 然后我們改造一下 wxml布局文件. 代碼邏輯很簡單, 就是通過判斷當前Image 節點的index和swiper展示節點的 index之間距離, 大于2就不顯示.

經過這樣的處理后, 我們的每個swiper組件, 最多只會有三個占用實際內存的 <Image/> 節點.

   <swiper-item wx:for="{{images}}"          wx:key="{{index}}">    <view >     <image class="img"         mode="widthFix"         src="{{index - curIndex < 2 && index - curIndex > -2 ? item.url : ''}}">     </image>    </view>   </swiper-item>

最后

以上就是我在這次性能優化中用到的一些小技巧, 希望能為你帶來一些幫助 :)

如果你對我的文章感興趣, 這里有我的一些 數據可視化, D3.js 方面的文章, 歡迎 fork && star:

https://github.com/ssthouse/ssthouse-blog

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大全免费观看电视剧大泉洋| 国产精品免费看久久久香蕉| 亚洲美女在线看| 久久精品国产欧美亚洲人人爽| 日韩免费看的电影电视剧大全| 亚洲片国产一区一级在线观看| 精品欧美一区二区三区| 欧美激情精品久久久久久蜜臀| 日韩av手机在线看| 日韩在线www| 中文字幕在线观看亚洲| 亚洲第一网站免费视频| 精品国产一区av| 国内免费久久久久久久久久久| 欧美精品手机在线| 91日韩在线播放| 久久久久久久久中文字幕| 91精品国产成人www| 欧美激情视频在线观看| 日韩免费观看视频| www.日韩不卡电影av| 国产精品久久久久久久久久免费| 欧美xxxx18性欧美| 午夜精品一区二区三区在线播放| 国产精品一区二区3区| 国产69精品久久久久久| 97在线视频免费| 国产精品盗摄久久久| 久久久久久亚洲精品中文字幕| 97超级碰碰碰久久久| 国产欧美日韩精品丝袜高跟鞋| 日韩经典一区二区三区| 国产91热爆ts人妖在线| 97视频在线观看播放| 热久久这里只有| 亚洲sss综合天堂久久| 欧美视频中文字幕在线| 亚洲精品美女在线观看播放| 亚洲国产成人91精品| 66m—66摸成人免费视频| 亚洲免费伊人电影在线观看av| 日韩网站免费观看| 国产精品www色诱视频| 精品国产欧美一区二区三区成人| 日韩美女免费视频| 一区二区三区美女xx视频| 情事1991在线| 亚洲小视频在线| www.美女亚洲精品| 日韩精品丝袜在线| 亚洲综合最新在线| 国产亚洲成av人片在线观看桃| 最新的欧美黄色| 欧美成人在线影院| 揄拍成人国产精品视频| 精品国产欧美一区二区三区成人| 懂色av一区二区三区| 国产成人精品电影久久久| 亚洲伦理中文字幕| 久久香蕉国产线看观看网| 精品综合久久久久久97| 在线看福利67194| 亚洲精品免费av| 91麻豆国产语对白在线观看| 久久精品99久久久香蕉| 国产精品久久久久久久app| 日韩国产高清污视频在线观看| 亚洲色图第三页| 欧美日韩一区二区在线| 97久久精品人搡人人玩| 久久躁狠狠躁夜夜爽| 在线观看日韩专区| 久久噜噜噜精品国产亚洲综合| 国产精品高潮呻吟视频| www.xxxx欧美| 欧美影院在线播放| 欧美日本啪啪无遮挡网站| 亚洲精品视频在线观看视频| 久久久国产一区二区三区| 国产成人精品久久| 成人福利免费观看| 久久中文久久字幕| 日韩av免费在线看| 精品欧美aⅴ在线网站| 精品视频在线播放免| 日韩人在线观看| 日韩欧美在线观看视频| 亚洲精品一区二区网址| 91久久久久久久| 俺去啦;欧美日韩| 91在线直播亚洲| 亚洲精品资源在线| 中文字幕国产精品| 亚洲国产女人aaa毛片在线| 欧美精品在线免费播放| 国产乱肥老妇国产一区二| 最近2019中文字幕第三页视频| 国产精品综合不卡av| 亚洲国产天堂久久综合网| 国产成人欧美在线观看| 欧美老女人在线视频| 欧美在线视频在线播放完整版免费观看| 韩国精品美女www爽爽爽视频| 国产精品一久久香蕉国产线看观看| 欧美黑人性生活视频| 91视频国产精品| 欧美丰满老妇厨房牲生活| 亚洲欧美日韩直播| 成人国内精品久久久久一区| 亚洲性日韩精品一区二区| 日韩欧美精品免费在线| 欧美激情精品久久久| 日韩成人在线网站| 国产精品国产三级国产专播精品人| 国产精品亚洲激情| 国产一区二区三区视频| 最好看的2019年中文视频| 欧美亚洲成人网| 日韩中文字幕在线| 色青青草原桃花久久综合| 日韩综合视频在线观看| 亚洲欧美日韩另类| 日韩欧美中文免费| 精品五月天久久| 亚洲免费伊人电影在线观看av| 日韩电影网在线| 4k岛国日韩精品**专区| 国产91在线高潮白浆在线观看| 欧美日韩色婷婷| 日韩美女在线看| 午夜免费在线观看精品视频| 国产精品亚洲综合天堂夜夜| 亚洲精品中文字幕有码专区| 国产噜噜噜噜噜久久久久久久久| 成人免费自拍视频| 欧美精品福利在线| 国产精品免费网站| 国产精品久久精品| 日韩有码视频在线| 日韩精品久久久久久久玫瑰园| 亚洲欧洲日韩国产| 久久综合88中文色鬼| 欧美精品福利在线| 欧美怡红院视频一区二区三区| 久久99久久99精品中文字幕| 九九热最新视频//这里只有精品| 欧美日韩xxxxx| 国模私拍一区二区三区| 日韩在线观看免费全集电视剧网站| 国产69精品久久久久久| 中文字幕日韩在线播放| 亚洲永久免费观看| 91av在线视频观看| 国产精品久久中文| 国产亚洲欧美另类中文| 精品福利在线观看| 成人在线免费观看视视频| 欧美大片欧美激情性色a∨久久| 亚洲老头老太hd| 中文字幕日韩电影| 国产亚洲欧洲高清一区| 亚州成人av在线| 日韩成人中文字幕在线观看| 欧美在线视频一区|