【JavaScript】微信小程序:高效性能優(yōu)化策略與實(shí)踐

本文作者:黃啟聰,碧桂園服務(wù)前端開發(fā)高/級(jí)工程師废麻,專注于運(yùn)用前沿的Web技術(shù)提升工作效率荠卷,并致力于打造卓越的交互式用戶體驗(yàn)。

01 前言

目前烛愧,鳳凰會(huì)商城支持全國(guó)商城油宜、門店掂碱、酒司令、地推慎冤、群接龍等多種業(yè)務(wù)疼燥,并且具備多端能力。一套代碼可以在鳳凰會(huì)APP蚁堤、移動(dòng)端H5和微信小程序中運(yùn)行醉者,研發(fā)效率得到提高的同時(shí),還能夠更快地支持業(yè)務(wù)迭代违寿。

隨著業(yè)務(wù)的持續(xù)更新和迭代湃交,鳳凰會(huì)商城小程序的渲染性能逐步下降,wei信后臺(tái)性能評(píng)估表現(xiàn)一般藤巢,同時(shí)在互聯(lián)網(wǎng)人口紅利消失搞莺、增量變緩的背景下,用戶對(duì)性能的要求不斷提高掂咒。因此才沧,性能優(yōu)化已成為開發(fā)者必須關(guān)注并解決的重要課題。本文將介紹wei信小程序性能優(yōu)化的關(guān)鍵策略和實(shí)踐绍刮,幫助開發(fā)者提供更出色的用戶體驗(yàn)温圆,以便更好地留住來(lái)之不易的增量用戶,進(jìn)一步助力業(yè)務(wù)成長(zhǎng)孩革。

02 性能指標(biāo)概述

在介紹性能優(yōu)化之前岁歉,我們先來(lái)了解一下小程序的啟動(dòng)流程。了解小程序的啟動(dòng)流程可以幫助開發(fā)者更有針對(duì)性地選擇性能優(yōu)化的手段膝蜈,分析性能優(yōu)化的效果锅移,并概述常見的性能指標(biāo)和問題,為后續(xù)的優(yōu)化工作打下基礎(chǔ)饱搏。

其中關(guān)鍵的幾個(gè)監(jiān)控指標(biāo)字段和對(duì)應(yīng)意義如下:

上表對(duì)應(yīng)鳳凰會(huì)商城頁(yè)面加載的幾個(gè)關(guān)鍵階段非剃,下面就門店示例其他頁(yè)面類推即可:

微信小程序評(píng)測(cè)中,性能評(píng)測(cè)報(bào)告會(huì)根據(jù)上面指標(biāo)加權(quán)平均得出性能評(píng)定推沸,如圖:

性能優(yōu)化是通過(guò)各種技術(shù)手段和策略來(lái)提高小程序的代碼包體積备绽、代碼注入、首屏渲染性能和網(wǎng)絡(luò)請(qǐng)求等方面的表現(xiàn)鬓催,從而提升應(yīng)用運(yùn)行性能和用戶體驗(yàn)需求肺素。

03 性能優(yōu)化策略和實(shí)踐

1、優(yōu)化啟動(dòng)時(shí)間

(1)分析包體積構(gòu)成宇驾,移除冗余無(wú)用的模塊

啟動(dòng)時(shí)間是用戶對(duì)小程序的第一印象压怠,直接影響用戶的留存和使用率。因此飞苇,我們深入分析了啟動(dòng)時(shí)間對(duì)用戶體驗(yàn)的影響菌瘫。

從小程序啟動(dòng)流程中可以看出蜗顽,下載時(shí)間是啟動(dòng)時(shí)間中的重要瓶頸。當(dāng)用戶首次訪問小程序或小程序版本更新時(shí)雨让,代碼包的下載會(huì)影響啟動(dòng)時(shí)間雇盖。

下載時(shí)間長(zhǎng)短受到網(wǎng)絡(luò)環(huán)境、代碼包壓縮后大小以及是否命中增量更新等因素的影響栖忠。為了優(yōu)化用戶體驗(yàn)崔挖,小程序平臺(tái)將單個(gè)小程序代碼包的大小上限限制為2M。針對(duì)代碼包體積的優(yōu)化庵寞,我們采取了以下策略:

(2)分包策略優(yōu)化

根據(jù)分析工具的結(jié)果顯示狸相,商城小程序的優(yōu)化重點(diǎn)是從主包中去除多余的類庫(kù)依賴,并將非主包依賴的配置文件下沉到對(duì)應(yīng)的業(yè)務(wù)子包中捐川。通過(guò)這樣的優(yōu)化措施脓鹃,可以減少代碼冗余并對(duì)代碼進(jìn)行精簡(jiǎn),從而提高小程序的性能和效果古沥。

分包策略優(yōu)化瘸右,每個(gè)子包體積控制在1.5M以下,理想狀態(tài)控制在500K左右岩齿。

將用戶常用頁(yè)面匯集到一個(gè)相對(duì)獨(dú)立的子包中形成閉環(huán)訪問太颤,從而避免頁(yè)面切換時(shí)需要重新下載相關(guān)聯(lián)的其他子包內(nèi)容。如下圖所示:

?微信開發(fā)者工具的代碼包體積分析顯示盹沈,經(jīng)過(guò)調(diào)整后每個(gè)關(guān)鍵業(yè)務(wù)子包的大小控制在500K左右龄章。這意味著用戶將能夠更快地加載關(guān)鍵頁(yè)面,從而提升用戶體驗(yàn)乞封。

(3)分包預(yù)下載

通過(guò)路徑分析來(lái)制定分包預(yù)下載策略瓦堵,可以將小程序的頁(yè)面根據(jù)依賴關(guān)系進(jìn)行劃分,將相互依賴的頁(yè)面進(jìn)行預(yù)下載歌亲,可以有效減少頁(yè)面切換時(shí)的加載時(shí)間。頁(yè)面依賴關(guān)系可以通過(guò)微信開發(fā)者工具的“數(shù)據(jù)分析”功能中的“行為分析”模塊查看澜驮。頁(yè)面路徑分析如圖所示:

如果用戶訪問小程序的主頁(yè)或商品列表頁(yè)面后陷揪,下級(jí)路徑中訪問搜索頁(yè)的比例較高,則可以配置在訪問到搜索頁(yè)的上級(jí)頁(yè)面時(shí)就預(yù)下載搜索頁(yè)杂穷。

優(yōu)化啟動(dòng)時(shí)間的實(shí)踐技巧包括減少代碼冗余悍缠、調(diào)整分包策略和頁(yè)面預(yù)加載。通過(guò)精簡(jiǎn)代碼耐量、合理加載資源和提前預(yù)加載頁(yè)面飞蚓,可以顯著縮短小程序的啟動(dòng)時(shí)間,提升用戶體驗(yàn)廊蜒。

2趴拧、優(yōu)化代碼注入

代碼注入是小程序啟動(dòng)過(guò)程中的性能瓶頸之一溅漾。我們將分析代碼注入對(duì)性能的影響,并介紹一些減少注入代碼數(shù)量和優(yōu)化注入效率的方法著榴,如按需注入添履、異步注入和使用合適的代碼格式等,以提升小程序的代碼注入性能脑又。針對(duì)代碼注入優(yōu)化主要采取的策略是:

(1)啟動(dòng)過(guò)程中減少同步API的調(diào)用

在小程序啟動(dòng)流程中暮胧,會(huì)順序同步執(zhí)行App.onLaunch、App.onShow问麸、Page.onLoad和Page.onShow往衷。

在小程序初始化代碼和上述啟動(dòng)相關(guān)的生命周期中,應(yīng)盡量減少或不調(diào)用同步API严卖。

同步API雖然使用起來(lái)更簡(jiǎn)單席舍,但會(huì)阻塞當(dāng)前JS線程,影響代碼執(zhí)行妄田。因此俺亮,如非必要,應(yīng)盡可能使用異步API代替同步API疟呐,并將啟動(dòng)過(guò)程中非必要的同步API調(diào)用延遲到啟動(dòng)完成后進(jìn)行脚曾。

針對(duì)減少同步API的調(diào)整策略:

同步API首次調(diào)用成功后倒源,將結(jié)果緩存起來(lái)查吊,之后再次調(diào)用時(shí)直接從緩存中獲取冲九。

同步API一般都有對(duì)應(yīng)的異步接口馁启,可以盡量使用異步接口熟嫩。

同步API可能會(huì)影響頁(yè)面渲染胯府,可以考慮延遲到渲染完成后再調(diào)用延届。

(2)按需注入

通常情況下消玄,小程序啟動(dòng)時(shí)會(huì)將所有代碼包中的JS代碼全部注入薯演,包括未訪問的頁(yè)面和未用到的自定義組件撞芍,這會(huì)影響注入耗時(shí)和內(nèi)存占用。

注意:啟用按需注入后跨扮,頁(yè)面中的所有自定義組件都會(huì)被注入和加載序无,建議開發(fā)者及時(shí)移除未使用的自定義組件聲明,并盡量避免在全局聲明使用率低的自定義組件衡创,否則可能會(huì)影響按需注入的效果帝嗡。

通過(guò)合理地管理和優(yōu)化代碼注入,可以減少不必要的代碼注入數(shù)量璃氢,提高注入效率哟玷,從而提高小程序的啟動(dòng)速度和運(yùn)行性能。

3一也、優(yōu)化渲染性能

渲染性能直接關(guān)系到小程序的流暢度和響應(yīng)速度巢寡。在本節(jié)中喉脖,我們將探討減少頁(yè)面渲染時(shí)間的關(guān)鍵策略,包括減少DOM元素讼渊、避免過(guò)度繪制和使用CSS動(dòng)畫等动看,幫助開發(fā)者提升小程序的渲染性能。

(1)避免引用未使用的自定義組件

通過(guò)減少不必要的組件加載和渲染爪幻,可以顯著提升小程序的啟動(dòng)速度和渲染性能菱皆。為了避免引用未使用的自定義組件,我們可以采取以下實(shí)踐策略:

分析和評(píng)估組件的使用情況:在開發(fā)過(guò)程中挨稿,仔細(xì)分析并評(píng)估每個(gè)自定義組件的使用情況仇轻。確保只在需要的頁(yè)面或組件中引用和使用自定義組件,避免不必要的引用奶甘。

移除未使用的組件引用:定期審查代碼并檢查自定義組件的引用篷店,移除未被使用的組件引用〕艏遥可以通過(guò)代碼靜態(tài)分析工具或IDE的功能來(lái)輔助識(shí)別未使用的組件引用疲陕。

動(dòng)態(tài)引用組件:對(duì)于一些特定場(chǎng)景,可以考慮在需要的時(shí)候動(dòng)態(tài)引用自定義組件钉赁。通過(guò)使用條件判斷或動(dòng)態(tài)渲染的方式蹄殃,根據(jù)實(shí)際需要來(lái)決定是否引用該組件,避免在不需要的情況下加載和渲染組件你踩。

(2)非必須組件延遲渲染

通過(guò)非必須組件延遲渲染可以將未使用到的組件的渲染過(guò)程延遲到用戶需要使用時(shí)才進(jìn)行诅岩,可以減少首次渲染DOM元素渲染數(shù)量,從而提升首屏渲染速度带膜。

通過(guò)優(yōu)化頁(yè)面結(jié)構(gòu)吩谦、減少不必要的DOM元素和延遲渲染等方法,可以有效降低小程序的頁(yè)面渲染時(shí)間膝藕,提升用戶的交互體驗(yàn)式廷。

?4、優(yōu)化網(wǎng)絡(luò)請(qǐng)求

網(wǎng)絡(luò)請(qǐng)求是小程序中常見的性能瓶頸之一芭挽。我們將分析網(wǎng)絡(luò)請(qǐng)求對(duì)性能的影響滑废,并介紹一些減少請(qǐng)求次數(shù)和優(yōu)化請(qǐng)求大小的方法,如合并請(qǐng)求览绿、緩存數(shù)據(jù)和使用合適的數(shù)據(jù)格式等,以提升小程序的網(wǎng)絡(luò)請(qǐng)求性能穗慕。

(1)緩存請(qǐng)求數(shù)據(jù)

小程序提供了wx.setStorage饿敲、wx.getStorage等讀寫本地緩存的能力,數(shù)據(jù)存儲(chǔ)在本地逛绵,返回會(huì)比網(wǎng)絡(luò)請(qǐng)求快怀各。當(dāng)使用小程序的本地緩存功能時(shí)倔韭,可以優(yōu)先從緩存中獲取數(shù)據(jù)來(lái)渲染視圖,然后在后臺(tái)進(jìn)行網(wǎng)絡(luò)請(qǐng)求并更新緩存瓢对。

(2)合并請(qǐng)求接口

當(dāng)在小程序中需要同時(shí)發(fā)起多個(gè)接口請(qǐng)求寿酌,并在所有請(qǐng)求完成后進(jìn)行處理時(shí),可以使用Promise.all方法來(lái)合并策略硕蛹。Promise.all接受一個(gè)由Promise對(duì)象組成的數(shù)組醇疼,并返回一個(gè)新的Promise對(duì)象,該P(yáng)romise對(duì)象在所有的Promise都成功解析后才會(huì)被解析法焰。

通過(guò)合理地管理和優(yōu)化網(wǎng)絡(luò)請(qǐng)求秧荆,可以減少不必要的請(qǐng)求次數(shù),從而提高小程序的加載速度和響應(yīng)性能埃仪。

04 總結(jié)與展望

通過(guò)實(shí)施上述多種優(yōu)化措施后乙濒,我們能夠通過(guò)微信官方We分析平臺(tái)輕松查看鳳凰會(huì)商城小程序的性能指標(biāo)和啟動(dòng)流程,從而及時(shí)發(fā)現(xiàn)并解決頁(yè)面性能問題卵蛉。這些優(yōu)化措施顯著提升了鳳凰會(huì)商城小程序的運(yùn)行性能——根據(jù)微信官方We分析平臺(tái)的數(shù)據(jù)颁股,鳳凰會(huì)商城小程序性能表現(xiàn)上明顯優(yōu)于同類應(yīng)用的均值360m。

通過(guò)實(shí)施上述優(yōu)化措施傻丝,鳳凰會(huì)商城小程序在性能方面取得了顯著成果甘有,這為我們提供了良好的基礎(chǔ),有助于持續(xù)改進(jìn)和發(fā)展鳳凰會(huì)商城小程序桑滩,為用戶提供更出色的體驗(yàn)梧疲。

未來(lái),我們將持續(xù)關(guān)注鳳凰會(huì)商城小程序的性能優(yōu)化运准,以確保用戶能夠快速幌氮、流暢地訪問和瀏覽鳳凰會(huì)商城,為用戶帶來(lái)便捷胁澳、高效和愉悅的購(gòu)物體驗(yàn)该互。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市韭畸,隨后出現(xiàn)的幾起案子宇智,更是在濱河造成了極大的恐慌,老刑警劉巖胰丁,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随橘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锦庸,警方通過(guò)查閱死者的電腦和手機(jī)机蔗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人萝嘁,你說(shuō)我怎么就攤上這事梆掸。” “怎么了牙言?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酸钦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我咱枉,道長(zhǎng)卑硫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任庞钢,我火速辦了婚禮拔恰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘基括。我一直安慰自己颜懊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布风皿。 她就那樣靜靜地躺著河爹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桐款。 梳的紋絲不亂的頭發(fā)上咸这,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音魔眨,去河邊找鬼媳维。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遏暴,可吹牛的內(nèi)容都是我干的侄刽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼朋凉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼州丹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杂彭,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤墓毒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亲怠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所计,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年团秽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了主胧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钾腺。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讥裤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻报,我是刑警寧澤己英,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吴旋,受9級(jí)特大地震影響损肛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荣瑟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一治拿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笆焰,春花似錦劫谅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至不皆,卻和暖如春贯城,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霹娄。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工能犯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犬耻。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓踩晶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親香追。 傳聞我的和親對(duì)象是個(gè)殘疾皇子合瓢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 歷史回顧: 微信小程序自定義組件 - 表格組件來(lái)啦 通過(guò)微信小程序來(lái)實(shí)現(xiàn) “釘釘打卡” 記一次微信小程序項(xiàng)目分包,...
    尤小小閱讀 2,804評(píng)論 0 2
  • 微信官方文檔:性能與體驗(yàn)[https://developers.weixin.qq.com/miniprogram...
    lmao94閱讀 1,226評(píng)論 0 0
  • 前言 2018年7月份微信公開課上的小程序?qū)?chǎng)中“小程序性能優(yōu)化”模塊中提到了小程序性能優(yōu)化方面的知識(shí)透典,其中從啟動(dòng)...
    Gopal閱讀 12,819評(píng)論 0 8
  • 最近了解了一下微信小程序的性能優(yōu)化晴楔,搜集了一些相關(guān)的方法,整理出來(lái)峭咒,和大家共享税弃。 一、控制代碼包大小 1. 開啟開...
    CC前端手記閱讀 283評(píng)論 0 0
  • 項(xiàng)目簡(jiǎn)述 & 問題 先簡(jiǎn)單介紹一下項(xiàng)目凑队,就是一個(gè)比較常規(guī)的點(diǎn)餐小程序则果。界面如圖: 左邊是分類菜單幔翰,右邊是長(zhǎng)列表,有...
    Dandelion_drq閱讀 692評(píng)論 0 2