小程序優(yōu)化

內(nèi)存預(yù)警

小程序提供了監(jiān)聽內(nèi)存不足告警事件的 API:wx.onMemoryWarning[23]鸡捐,旨在讓開發(fā)者收到告警時(shí)及時(shí)釋放內(nèi)存資源避免小程序 Crash箍镜。然而對(duì)于小程序開發(fā)者來說,內(nèi)存資源目前是無法直接觸碰的色迂,最多就是調(diào)用 wx.reLaunch 清理所有頁面棧歇僧,重載當(dāng)前頁面,來降低內(nèi)存負(fù)荷(此方案過于粗暴诈悍,別沖動(dòng)侥钳,想想就好...)。

不過內(nèi)存告警的信息收集倒是有意義的苦酱,我們可以把內(nèi)存告警信息(包括頁面路徑、客戶端版本疫萤、終端手機(jī)型號(hào)等)上報(bào)到日志系統(tǒng)扯饶,分析出哪些頁面 Crash 率比較高,從而針對(duì)性地做優(yōu)化帝际,降低頁面復(fù)雜度等等蹲诀。

回收后臺(tái)頁面計(jì)時(shí)器

根據(jù)雙線程模型弃揽,小程序每一個(gè)頁面都會(huì)獨(dú)立一個(gè) webview 線程,但邏輯層是單線程的痕慢,也就是所有的 webview 線程共享一個(gè) JS 線程涌矢。以至于當(dāng)頁面切換到后臺(tái)態(tài)時(shí),仍然有可能搶占到邏輯層的資源塔次,譬如沒有銷毀的 setInterval名秀、setTimeout 定時(shí)器:

// Page A
Page({
  onLoad() {
    let i = 0
    setInterval(() => { i++ }, 100)
  }
})

即使如小程序的 <swiper> 組件,在頁面進(jìn)入后臺(tái)態(tài)時(shí)依然是會(huì)持續(xù)輪播的继榆。
正確的做法是汁掠,在頁面 onHide 的時(shí)候手動(dòng)把定時(shí)器清理掉考阱,有必要時(shí)再在 onShow 階段恢復(fù)定時(shí)器。坦白講羔砾,區(qū)區(qū)一個(gè)定時(shí)器回調(diào)函數(shù)的執(zhí)行,對(duì)于系統(tǒng)的影響應(yīng)該是微不足道的政溃,但不容忽視的是回調(diào)函數(shù)里的代碼邏輯董虱,譬如在定時(shí)器回調(diào)里持續(xù) setData 大量數(shù)據(jù),這就非常難受了...

避免頻發(fā)事件中的重度內(nèi)存操作

我們經(jīng)常會(huì)遇到這樣的需求:廣告曝光云头、圖片懶加載淫半、導(dǎo)航欄吸頂?shù)鹊龋@些都需要我們?cè)陧撁鏉L動(dòng)事件觸發(fā)時(shí)實(shí)時(shí)監(jiān)聽元素位置或更新視圖昏滴。在了解小程序的雙線程模型之后不難發(fā)現(xiàn)对人,頁面滾動(dòng)時(shí) onPageScroll 被頻發(fā)觸發(fā),會(huì)使邏輯層和視圖層發(fā)生持續(xù)通信姻几,若這時(shí)候再 “火上澆油” 調(diào)用 setData 傳輸大量數(shù)據(jù)势告,會(huì)導(dǎo)致內(nèi)存使用率快速上升培慌,使頁面卡頓甚至 “假死”。所以盒音,針對(duì)頻發(fā)事件的監(jiān)聽馅而,我們最好遵循以下原則:

onPageScroll 事件回調(diào)使用節(jié)流;
避免 CPU 密集型操作雄坪,譬如復(fù)雜的計(jì)算屯蹦;
避免調(diào)用 setData绳姨,或減小 setData 的數(shù)據(jù)量飘庄;
盡量使用 IntersectionObserver[24] 來替代 SelectorQuery[25]购撼,前者對(duì)性能影響更小碾盐;

大圖揩局、長(zhǎng)列表優(yōu)化

據(jù) 小程序官方文檔[26] 描述,大圖片和長(zhǎng)列表圖片在 iOS 中會(huì)引起 WKWebView 的回收孕豹,導(dǎo)致小程序 Crash十气。

對(duì)于大圖片資源(譬如滿屏的 gif 圖)來說砸西,我們只能盡可能對(duì)圖片進(jìn)行降質(zhì)或裁剪址儒,當(dāng)然不使用是最好的嫁佳。

對(duì)于長(zhǎng)列表立美,譬如瀑布流蝶俱,這里提供一種思路:我們可以利用 IntersectionObserver[27] 監(jiān)聽長(zhǎng)列表內(nèi)組件與視窗之間的相交狀態(tài)法挨,當(dāng)組件距離視窗大于某個(gè)臨界點(diǎn)時(shí)叉寂,銷毀該組件釋放內(nèi)存空間翁逞,并用等尺寸的骨架圖占坑溉仑;當(dāng)距離小于臨界點(diǎn)時(shí)浊竟,再取緩存數(shù)據(jù)重新加載該組件津畸。

然而無可避免地必怜,當(dāng)用戶快速滾動(dòng)長(zhǎng)列表時(shí)棚赔,被銷毀的組件可能來不及加載完,視覺上就會(huì)出現(xiàn)短暫的白屏丧肴。我們可以適當(dāng)?shù)卣{(diào)整銷毀閾值胧后,或者優(yōu)化骨架圖的樣式來盡可能提升體驗(yàn)感芋浮。

小程序官方提供了一個(gè) 長(zhǎng)列表組件[28],可以通過 npm 包的方式引入壳快,有興趣的可以嘗試纸巷。

參考資料
[1]
Taro: https://taro.aotu.io/

[2]
小程序性能評(píng)分規(guī)則: https://developers.weixin.qq.com/miniprogram/dev/framework/audits/performance.html

[3]
體驗(yàn)評(píng)分工具(Audits 面板): https://developers.weixin.qq.com/miniprogram/dev/framework/audits/audits.html

[4]
測(cè)速系統(tǒng): https://developers.weixin.qq.com/miniprogram/dev/framework/performanceReport/

[5]
JS Tree-Shaking: https://developers.google.com/web/fundamentals/performance/optimizing-javascript/tree-shaking

[6]
PurifyCSS: https://github.com/purifycss/purifycss

[7]
使用分包: https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/basic.html

[8]
獨(dú)立分包: https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/independent.html

[9]
web-view: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

[10]
小程序開發(fā)文檔: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

[11]
數(shù)據(jù)預(yù)拉取: https://developers.weixin.qq.com/miniprogram/dev/framework/ability/pre-fetch.html

[12]
這里: https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/operating-mechanism.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8

[13]
分包預(yù)下載: https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/preload.html

[14]
關(guān)鍵渲染路徑(Critical Rendering Path): https://developers.google.com/web/fundamentals/performance/critical-rendering-path

[15]
wx.request: https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

[16]
WebP: https://developers.google.com/speed/webp

[17]
image 組件: https://developers.weixin.qq.com/miniprogram/dev/component/image.html

[18]
image 組件: https://developers.weixin.qq.com/miniprogram/dev/component/image.html

[19]
w3schools: https://www.w3schools.com/css/css_image_sprites.asp

[20]
事件循環(huán): https://github.com/aooy/blog/issues/5

[21]
數(shù)據(jù) diff 規(guī)則: https://nervjs.github.io/taro/docs/optimized-practice.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%95%B0%E6%8D%AE-diff

[22]
Web Components: https://developer.mozilla.org/zh-CN/docs/Web/Web_Components

[23]
wx.onMemoryWarning: https://developers.weixin.qq.com/miniprogram/dev/api/device/performance/wx.onMemoryWarning.html

[24]
IntersectionObserver: https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.html

[25]
SelectorQuery: https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html

[26]
小程序官方文檔: https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips.html

[27]
IntersectionObserver: https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.html

[28]
長(zhǎng)列表組件: https://developers.weixin.qq.com/miniprogram/dev/extended/functional/recycle-view.html

[29]
User-centric Performance Metrics: https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics

[30]
Reduce JavaScript Payloads with Tree Shaking: https://developers.google.com/web/fundamentals/performance/optimizing-javascript/tree-shaking

[31]
小程序開發(fā)指南: https://developers.weixin.qq.com/ebook?action=get_post_info&docid=0008aeea9a8978ab0086a685851c0a

[32]
小程序官方文檔: https://developers.weixin.qq.com/miniprogram/dev/framework/

[33]
Taro 官方文檔: https://taro.aotu.io/home/in.html

[34]
探究WebP一些事兒: https://aotu.io/notes/2016/06/23/explore-something-of-webp/index.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眶痰,隨后出現(xiàn)的幾起案子瘤旨,更是在濱河造成了極大的恐慌,老刑警劉巖竖伯,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異七婴,居然都是意外死亡祟偷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門打厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修肠,“玉大人,你說我怎么就攤上這事户盯∏妒” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵先舷,是天一觀的道長(zhǎng)艰管。 經(jīng)常有香客問我,道長(zhǎng)蒋川,這世上最難降的妖魔是什么牲芋? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缸浦,老公的妹妹穿的比我還像新娘夕冲。我一直安慰自己,他們只是感情好裂逐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布歹鱼。 她就那樣靜靜地躺著,像睡著了一般卜高。 火紅的嫁衣襯著肌膚如雪弥姻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天掺涛,我揣著相機(jī)與錄音庭敦,去河邊找鬼。 笑死薪缆,一個(gè)胖子當(dāng)著我的面吹牛秧廉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拣帽,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼疼电,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了减拭?” 一聲冷哼從身側(cè)響起蔽豺,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拧粪,沒想到半個(gè)月后茫虽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡既们,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了正什。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥纸。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婴氮,靈堂內(nèi)的尸體忽然破棺而出斯棒,到底是詐尸還是另有隱情,我是刑警寧澤主经,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布荣暮,位于F島的核電站,受9級(jí)特大地震影響罩驻,放射性物質(zhì)發(fā)生泄漏穗酥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾跃。 院中可真熱鬧骏啰,春花似錦、人聲如沸抽高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘骂。三九已至壁熄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碳竟,已是汗流浹背草丧。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞭亮,地道東北人方仿。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像统翩,于是被迫代替她去往敵國和親仙蚜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 每天的學(xué)習(xí)記錄厂汗,可能有的地方寫的不對(duì)委粉,因?yàn)閯倢W(xué),以后發(fā)現(xiàn)錯(cuò)的話會(huì)回來改掉整體流程 https://develope...
    有點(diǎn)健忘閱讀 4,676評(píng)論 0 7
  • 優(yōu)點(diǎn) 無需安裝娶桦。 隨處可見贾节,隨處使用。 使用完衷畦,無需寫在卸載栗涂。 小程序的申請(qǐng)地址。 https://mp.weix...
    taijielan閱讀 327評(píng)論 0 0
  • 本文主要是從代碼方面跟大家分享我自己在開發(fā)小程序的一些做法祈争,希望能幫到一些同學(xué)斤程。 前言 不知道大家有沒有這種體會(huì),...
    _鵝不食草_閱讀 2,888評(píng)論 0 0
  • 楊小姐的feelstyle,搗鼓5個(gè)月小程序沮峡,良心總結(jié)疚脐,跨年之作hahaha~! 所謂小程序通用能力邢疙,就是如果你要...
    可可小米閱讀 3,398評(píng)論 2 61
  • 九日上午出門隨便逛逛棍弄,很快受不了熾烈的陽光望薄,早早吃過午飯回去休息,直到下午六點(diǎn)過才到奧帆中心乘坐游艇出海照卦。 海上風(fēng)...
    山居散人閱讀 2,349評(píng)論 32 82