小程序优化

内存预警

小程序提供了监听内存不足告警事件的 API:wx.onMemoryWarning[23],旨在让开发者收到告警时及时释放内存资源避免小程序 Crash。然而对于小程序开发者来说,内存资源目前是无法直接触碰的,最多就是调用 wx.reLaunch 清理所有页面栈,重载当前页面,来降低内存负荷(此方案过于粗暴,别冲动,想想就好...)。

不过内存告警的信息收集倒是有意义的,我们可以把内存告警信息(包括页面路径、客户端版本、终端手机型号等)上报到日志系统,分析出哪些页面 Crash 率比较高,从而针对性地做优化,降低页面复杂度等等。

回收后台页面计时器

根据双线程模型,小程序每一个页面都会独立一个 webview 线程,但逻辑层是单线程的,也就是所有的 webview 线程共享一个 JS 线程。以至于当页面切换到后台态时,仍然有可能抢占到逻辑层的资源,譬如没有销毁的 setInterval、setTimeout 定时器:

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

即使如小程序的 <swiper> 组件,在页面进入后台态时依然是会持续轮播的。
正确的做法是,在页面 onHide 的时候手动把定时器清理掉,有必要时再在 onShow 阶段恢复定时器。坦白讲,区区一个定时器回调函数的执行,对于系统的影响应该是微不足道的,但不容忽视的是回调函数里的代码逻辑,譬如在定时器回调里持续 setData 大量数据,这就非常难受了...

避免频发事件中的重度内存操作

我们经常会遇到这样的需求:广告曝光、图片懒加载、导航栏吸顶等等,这些都需要我们在页面滚动事件触发时实时监听元素位置或更新视图。在了解小程序的双线程模型之后不难发现,页面滚动时 onPageScroll 被频发触发,会使逻辑层和视图层发生持续通信,若这时候再 “火上浇油” 调用 setData 传输大量数据,会导致内存使用率快速上升,使页面卡顿甚至 “假死”。所以,针对频发事件的监听,我们最好遵循以下原则:

onPageScroll 事件回调使用节流;
避免 CPU 密集型操作,譬如复杂的计算;
避免调用 setData,或减小 setData 的数据量;
尽量使用 IntersectionObserver[24] 来替代 SelectorQuery[25],前者对性能影响更小;

大图、长列表优化

据 小程序官方文档[26] 描述,大图片和长列表图片在 iOS 中会引起 WKWebView 的回收,导致小程序 Crash。

对于大图片资源(譬如满屏的 gif 图)来说,我们只能尽可能对图片进行降质或裁剪,当然不使用是最好的。

对于长列表,譬如瀑布流,这里提供一种思路:我们可以利用 IntersectionObserver[27] 监听长列表内组件与视窗之间的相交状态,当组件距离视窗大于某个临界点时,销毁该组件释放内存空间,并用等尺寸的骨架图占坑;当距离小于临界点时,再取缓存数据重新加载该组件。

然而无可避免地,当用户快速滚动长列表时,被销毁的组件可能来不及加载完,视觉上就会出现短暂的白屏。我们可以适当地调整销毁阈值,或者优化骨架图的样式来尽可能提升体验感。

小程序官方提供了一个 长列表组件[28],可以通过 npm 包的方式引入,有兴趣的可以尝试。

参考资料
[1]
Taro: https://taro.aotu.io/

[2]
小程序性能评分规则: https://developers.weixin.qq.com/miniprogram/dev/framework/audits/performance.html

[3]
体验评分工具(Audits 面板): https://developers.weixin.qq.com/miniprogram/dev/framework/audits/audits.html

[4]
测速系统: 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]
独立分包: 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]
小程序开发文档: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

[11]
数据预拉取: 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]
分包预下载: https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/preload.html

[14]
关键渲染路径(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]
事件循环: https://github.com/aooy/blog/issues/5

[21]
数据 diff 规则: 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]
长列表组件: 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]
小程序开发指南: 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 每天的学习记录,可能有的地方写的不对,因为刚学,以后发现错的话会回来改掉整体流程 https://develope...
    有点健忘阅读 4,620评论 0 7
  • 优点 无需安装。 随处可见,随处使用。 使用完,无需写在卸载。 小程序的申请地址。 https://mp.weix...
    taijielan阅读 322评论 0 0
  • 本文主要是从代码方面跟大家分享我自己在开发小程序的一些做法,希望能帮到一些同学。 前言 不知道大家有没有这种体会,...
    _鹅不食草_阅读 2,877评论 0 0
  • 杨小姐的feelstyle,捣鼓5个月小程序,良心总结,跨年之作hahaha~! 所谓小程序通用能力,就是如果你要...
    可可小米阅读 3,386评论 2 61
  • 九日上午出门随便逛逛,很快受不了炽烈的阳光,早早吃过午饭回去休息,直到下午六点过才到奥帆中心乘坐游艇出海。 海上风...
    山居散人阅读 2,338评论 32 82