小さなプログラムを最適化するにはどうすればよいですか?この記事では、ミニ プログラムの最適化の実踐をまとめ、ミニ プログラムの最適化項目について説明します。
ミニ プログラムの実行プロセス
まず、ミニ プログラムの動作原理を整理しましょう。休むことなく木を切ります。
百聞は一見に如かず:
畫像の內容を注意深く理解することをお勧めします。小さなプログラムに対する強力な理論的サポートがあります。開発と最適化の方向性。
最適化項目
1. 下請けの適正利用
WeChat miniのポイントプログラム 高速起動が特徴ですが、この機能に関して公式はパッケージサイズを2Mまでと制限しています。
下請けはミニ プログラムの最適化にとって最優(yōu)先事項であり、これによりミニ プログラムの起動速度とページを開く速度を効果的に向上させることができます。
パッケージは[本體パッケージ][通常下請け][獨立下請け]に分かれています。
[メイン パッケージ] には、スタートアップ ページまたは TabBar ページのみを配置する必要があります。
[通常のサブパッケージ] TabBar ページ以外のページを配置するため、ページ數やモジュール數に応じて複數のサブパッケージを分割し、サイズを小さくすることを推奨します。ユーザーが対応するサブパッケージ ページに入ると、このパッケージは必要な場合にのみダウンロードされるため、パッケージのオンデマンド読み込みも可能になり、リソースの無駄が回避されます。通常のサブパッケージ內のページからミニプログラムを起動する場合、最初にメインパッケージをダウンロードし、次にサブパッケージをダウンロードする必要があります。
[獨立サブパッケージ] 獨立性の高いページをいくつか配置し、獨立サブパッケージ內のページからミニプログラムを起動すると、獨立サブパッケージのみがダウンロードされるため、起動が大幅に改善されます。ミニ プログラムの速度 ユーザーが、対応するパッケージをダウンロードするために戻る前に、TabBar ページまたは他の通常のサブパッケージ ページに移動するとき。
獨立したサブパッケージにはコンポーネントやログインなどのグローバルなものを含めることはできず、他のパッケージからリソースを導入するとエラーが発生します。
著者は、外注する前にページと機能を整理することを推奨しています。外注の制限は、パッケージのサイズが 2M を超えることではなく、 ビジネスと機能に応じて柔軟に分割する必要があります?,F在の通常のネットワーク狀況では、2M サブパッケージと 500KB サブパッケージのダウンロードに特に大きな違いは感じられないかもしれませんが、ネットワークが弱い環(huán)境では、この 2 つの違いは大きく異なります。そうしないと、ユーザーが空白の畫面を表示する時間に大きなギャップが生じます(個人的な経験です。これは胸が張り裂けるようなものであると言えます)。
パッケージが分割された以上、當然ながら【サブパッケージの事前ダウンロード】は必須となります。たとえば、TabBar ページから直接アクセスでき、頻度が高い二次ページをサブパッケージに配置し、その後にその他のページを配置します。より深いページ または、それほど重要ではないページをパッケージに分割するか、注文ビジネス モジュール全體のページをパッケージに分割します。
公式サイトのルールに従って設定することができ、ユーザーが特定のページに入ると、事前にパッケージがダウンロードされます。
2. オンデマンドでの注入<span style="font-size: 18px;"></span>
アプレットがパッケージをダウンロードした後、パッケージのすべてのJS## が開きます。 #Merge インジェクション、一部の未訪問のページおよび未使用のカスタム コンポーネントも実行環(huán)境にインジェクションされます。注入時間とメモリ使用量に影響します。私たちが望んでいるのは、パッケージのダウンロードが完了したときに、これから開こうとしているページのコードのみが挿入されることです。
{ "lazyCodeLoading" : "requiredComponents" }
3. <span style="font-size: 18px;"></span>setData<span style="font-size: 18px;"></span>
# # のいくつかの呼び出し原則を明確にする#ミニ プログラムは WeChat クライアント上で実行されます。つまり、wxml
wxs、
wxss はすべてクライアント上で実行され、オペレーティング システム環(huán)境 レンダリング スレッドとロジック スレッドの 2 つのスレッドに分割されます。レンダリング層はレンダリングに
WebView を使用し、ロジック層は
JSCore を使用して
JS コードを実行します。
wxml と
wxss はレンダリング スレッドで動作し、
wxs は論理スレッドで動作します。 2 つのスレッド間で通信するにはどうすればよいでしょうか?
レンダリング層はイベントをトリガーし、クライアントに応答します。ロジック層は setData を渡し、データをクライアントに送信します。両側のデータは文字列に変換されて送信されます。クライアントは個別に応答し、応答はリアルタイムではありません。これは、ロジック層で
setData をトリガーするページがすぐには更新されず、レンダリング層が更新されるまでに多少の遅延が生じることを意味します。
モデルは図に示すとおりです。
ネイティブはクライアントです。
回到問題,setData
在邏輯層調用,讓渲染層快速響應取決于邏輯層到客戶端的數據傳輸效率,而這個傳輸效率又取決于你傳輸數據的大小,所以在調用setData
的時候應該盡可能減少數據傳輸大小。
Native
會將wxml
轉換成 js對象,然后和setData
傳進來的對象做差異化對比,將差異化渲染到視圖上。
綜上原理,我們調用setData
應該遵循幾個原則:
- 盡可能減小需要 setData 數據的大小,
JSON.stringify
后不超過 256KB。 - 避免將不需要渲染的數據(不在
wxml
中綁定的數據)傳入setData
,減少差異對比耗時。 - 避免過于頻繁調用
setData
,會導致邏輯層業(yè)務繁忙,一直在處理setData
的傳輸隊列,而導致抽不開身去處理渲染層的響應,從而導致渲染阻塞,頁面出現卡頓,甚至setData
無效。如果可以的話,可以采用節(jié)流等方式進行優(yōu)化。 - 盡可能將多個需要更新的數據合并為一次
setData
,減少通信過程。 - 避免后臺頁面觸發(fā)
setData
,也會占用Js線程,有可能會造成阻塞,導致真正需要setData
的數據沒有響應
減小setData
的數據大小通常在列表場景中,通常只更新需要更新的下標:
const needRefresh = `list[${index}]` // 寫法一 setData({ [needRefresh]: '新值' }) // 寫法二 setData({ [`list[${index}]`]: '新值' }) // 寫法三 setData({ 'list[0]': '新值' }) // 寫法四 const needRefresh = `list[${index}].disabled` setData({ [needRefresh]: '新值' }) // 寫法5 更新對象 setData({ 'personal.name':'xxx' })
如果有變量,就需要放在
[]
內。
4. 控制圖片大小比例
圖片太大會增加下載時間和內存的消耗,并且為了用戶體驗,應該控制圖片的高寬比例,防止圖片變形或者被裁切(這個問題可以根據
image
的mode
屬性進行調整)。
一個合格的圖片應該滿足以下兩點:
圖片寬高乘積 <= 實際顯示寬高乘積 * (設備像素比 ^ 2)。
顯示的高/寬與原圖的高/寬不超過 15%。
由于這些圖片都出自 UI,所以在這一條優(yōu)化上你需要做的是:拿著這兩條指標去跟 UI battle。
good lucky ~
以上第一條就是和設備的【dpr】相關,移動端開發(fā)一定要理解【dpr】,這里就不多贅述了。
我們應該合理的采用圖片資源,例如在【dpr】為 2 的設備上,一個 60x60 的元素區(qū)域顯示的圖片為了兼顧清晰度與資源大小,圖片大小不應該超過 120x120, 同理,【dpr】為 3 設備,圖片應該不超過 180x180。
我們小程序的資源都放在cdn上,可以利用cdn的圖片云處理功能對資源請求進行控制,我司用的七牛云和又拍云,如下:
// 七牛云 `${_src}?imageMogr2/thumbnail/!${scaleRatio}p` // 又拍云 `${_src}!/scale/${scaleRatio}`
更多云處理功能可以挪步官網:七牛云(https://developer.qiniu.com/dora/8255/the-zoom) 和又拍云(https://help.upyun.com/knowledge-base/image/)
我們在小程序內自定義了圖片組件 cus-image
, 該組件會根據【dpr】對圖片進行云處理。并提供了 ratio
屬性靈活調整圖片大?。ㄒ驗檫\營方上傳的圖片可能在不同尺寸的元素區(qū)域內引用,所以需要開發(fā)人員靈活控制)。
5. 避免短時間內發(fā)起太多請求
小程序中wx.request
、wx.uploadFile
、wx.downloadFile
的發(fā)起的網絡請求短時間內最大并發(fā)限制是 10 個,超過 10 個就會導致請求阻塞。而圖片請求的并發(fā)最大數量為6。
那短時間怎么去界定呢?
- 【網絡請求】耗時超過 300ms 的請求并發(fā)數不超過 10 個(一般不會出現這個問題,如果有這個問題那可能該考慮拆分頁面、拆分業(yè)務或者合并接口了。)
- 【圖片請求】同域名耗時超過 100ms 的圖片請求并發(fā)數不超過 6 個
例如:300ms內發(fā)送了12個請求,其中10個請求在300ms內就請求完成了,只有2個請求超過300ms,這樣是沒有問題的。
【解決方案】
- 在接口請求上我們應該盡可能的減少請求數量。
- 圖片可以設置懶加載
lazy-load
。 - 圖標可以使用雪碧圖。
- 將圖片資源拆分在多個域名下。
- 自定義一個分片處理函數,將請求拆分成數個階段發(fā)出。
function interelTasks(task,wait){ this.data.timer = setInterval(()=>{ task() }, wait) } async function task(promiseList = []){ const result = await promise.all(promiseList) // do something }
叨擾一句:有些時候在請求數量限制范圍內,我們應該對沒有先后順序的接口進行并發(fā)處理,提高接口處理效率。
6. 請求耗時優(yōu)化
這一點主要體現在兩個方面——【接口】和【靜態(tài)資源】。
【接口】基本上不應該超過1000ms,哪怕是幾百毫秒也可能需要做一些優(yōu)化了,基本上正常速度在10-200ms,個別接口幾百也正常,大部分都應該不超過500ms(后端大佬請消消氣)。
【靜態(tài)資源】首先從資源的大小考慮出發(fā),大部分資源是圖片,可以參考上面的圖片大小標準。其次考慮資源緩存,對于小程序而言,靜態(tài)資源基本上是存放在cdn上的,設置緩存可以有效的提高客戶端表現性能。
這邊給大家分享一個圖片壓縮網站:https://tinypng.com/
7. 避免使用過大的 WXML 節(jié)點數目
建議一個頁面使用少于 1000 個 WXML 節(jié)點,節(jié)點樹深度少于 30 層,子節(jié)點數不大于 60 個。一個太大的 WXML 節(jié)點樹會增加內存的使用,樣式重排時間也會更長,影響體驗。
頁面的節(jié)點數包含所有子節(jié)點數,需要注意的是子節(jié)點數,若一個子節(jié)點數大于60的時候,或許你就該考慮對組件或者頁面進行重新劃分了。
基本功!
8. 使用骨架屏
骨架屏相信大家都不陌生,如果我們的優(yōu)化手段都用盡了,頁面需要加載的資源本身就比較多,那骨架屏也是我們退而求其次的最佳方案了,也算是“曲線救國“了。
實現骨架屏的方式有多種,你可以自己寫一個骨架組件,也可以用一些生成骨架屏的插件。除此之外,小程序還提供了白嫖方案,開發(fā)者工具提供了自動生成骨架屏代碼的能力。
詳情請訪問 https://developers.weixin.qq.com/miniprogram/dev/devtools/skeleton.html
9. 合理的進行組件拆分并減小<span style="font-size: 18px;">data</span>
的大小
微信小程序的更新是基于組件的,自定義組件的更新只會在組件內部,這能減少差異比較帶來的耗時。
控制data
的大小主要是為了減少內存消耗,比如在data
中定義一些圖片路徑的變量,如果可以,我更推薦通過background
的方式去加載一些圖片。
10. 滾動區(qū)域設置慣性滾動
慣性滾動會使?jié)L動比較順暢,在安卓下默認有慣性滾動,而在 iOS 下需要額外設置 -webkit-overflow-scrolling: touch
的樣式。
11. 擴大點擊元素的可點擊區(qū)域
微信規(guī)定最小可點擊區(qū)域應該不小于 20x20 像素。這種樣式問題不多贅述了,八仙過海,各顯神通。
最后
性能優(yōu)化不是一個技術債務,而是需要我們在平時的迭代版本中去不斷的優(yōu)化或重構,團隊中的成員都應該明確這一點。
性能優(yōu)化不僅僅是前端的事情,是需要團隊中各個不同的職責相互配合才能做好的事情,所以,如果你發(fā)現接口慢,圖片大,請勇敢的提出來,并和你的同事溝通解決。事無巨細,都很重要。
還有一些更細節(jié)的優(yōu)化點可以參考官網地址:
- https://developers.weixin.qq.com/miniprogram/dev/framework/audits/audits.html
如果有什么問題歡迎留言指正。
【相關學習推薦:小程序開發(fā)教程】
以上がミニプログラムを最適化する方法を段階的に説明しましょう。 (実踐まとめ)の詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)