×
微信小程序开发教程手册文档体验微信小程序微信小程序 框架MINA 目录结构小程序配置逻辑层(App Service)微信小程序 注册程序微信小程序 场景值微信小程序 注册页面微信小程序 路由微信小程序 模块化小程序 API视图层(View)微信小程序 WXML微信小程序 数据绑定微信小程序 列表渲染微信小程序 条件渲染微信小程序 模板微信小程序 事件微信小程序 引用微信小程序 WXS微信小程序 WXS模块微信小程序 变量微信小程序 注释微信小程序 运算符微信小程序 语句微信小程序 数据类型微信小程序 基础类库微信小程序 WXSS微信小程序 组件微信小程序 基础库微信小程序 兼容微信小程序 运行机制性能微信小程序 性能Trace工具微信小程序 优化建议微信小程序 组件

视图容器

wxapp视图容器 viewwxapp视图容器 scroll-viewwxapp视图容器 swiperwxapp视图容器 movable-areawxapp视图容器 cover-view

基础内容

wxapp内容组件 iconwxapp内容组件 textwxapp内容组件 rich-textwxapp内容组件 progress表单组件wxapp表单组件 buttonwxapp表单组件 checkboxwxapp表单组件 formwxapp表单组件 inputwxapp表单组件 labelwxapp表单组件 pickerwxapp表单组件 picker-viewwxapp表单组件 radiowxapp表单组件 sliderwxapp表单组件 switchwxapp表单组件 textarea

导航

wxapp导航 navigator

媒体组件

wxapp媒体组件 audiowxapp媒体组件 imagewxapp媒体组件 videowxapp媒体组件 camera

地图

wxapp地图 map

画布

wxapp画布 canvas

开放数据

wxapp开放数据 open-datawxapp承载网页 web-view

客服会话

wxapp客服会话 contact-buttonAPI网络微信小程序API 发起请求微信小程序API 上传、下载微信小程序API Websocket

媒体

微信小程序API 图片微信小程序API 录音微信小程序API 音频播放控制微信小程序API 音乐播放控制微信小程序API 背景音频播放管理微信小程序API 音频组件控制微信小程序API 视频微信小程序API 视频组件控制微信小程序API 相机组件控制

文件

微信小程序API 文件

数据

微信小程序API 数据缓存

位置

微信小程序API 获取位置微信小程序API 查看位置微信小程序API 地图组件控制设备微信小程序API 系统信息微信小程序API 网络状态微信小程序API 加速度计微信小程序API 罗盘微信小程序API 拨打电话微信小程序API 扫码微信小程序API 剪贴板微信小程序API 蓝牙微信小程序API iBeacon微信小程序API 屏幕亮度微信小程序API 用户截屏事件微信小程序API 振动微信小程序API 手机联系人

界面

微信小程序API 交互反馈微信小程序API 设置导航条微信小程序API 设置置顶信息微信小程序API 导航微信小程序API 动画微信小程序API 位置绘图微信小程序API 绘图·介绍微信小程序API 绘图·坐标系微信小程序API 绘图·渐变微信小程序API 绘图·颜色微信小程序API 绘图上下文微信小程序API 绘图·创建并返回上下文微信小程序API 绘图·绘制画布微信小程序API 绘图·导出图片微信小程序API 绘图·设置填充样式微信小程序API 绘图·设置线条样式微信小程序API 绘图·设置阴影样式微信小程序API 绘图·创建线性渐变微信小程序API 绘图·创建圆形渐变微信小程序API 绘图·创建颜色渐变点微信小程序API 绘图·设置线条宽度微信小程序API 绘图·设置线条端点样式微信小程序API 绘图·设置线条交点样式微信小程序API 绘图·设置最大倾斜微信小程序API 绘图·创建矩形微信小程序API 绘图·填充矩形微信小程序API 绘图·画一个矩形微信小程序API 绘图·clearRect微信小程序API 绘图·填充路径微信小程序API 绘图·描边路径微信小程序API 绘图·开始路径微信小程序API 绘图·关闭路径微信小程序API 绘图·moveTo微信小程序API 绘图·lineTo微信小程序API 绘图·画弧线微信小程序API 绘图·quadraticCurveTo微信小程序API bezierCurveTo微信小程序API 绘图·scale微信小程序API 绘图·rotate微信小程序API 绘图·translate微信小程序API 绘图·设置字号微信小程序API 绘图·绘制文本微信小程序API 绘图·文字对齐微信小程序API 绘图·文字水平对齐微信小程序API 绘图·drawImage微信小程序API 绘图·setGlobalAlpha微信小程序API 绘图·保存/恢复微信小程序API 绘图·draw微信小程序API 绘图·getActions微信小程序API 绘图·clearActions微信小程序API 绘图·measureText微信小程序API 绘图·globalCompositeOperation微信小程序API 绘图·arcTo微信小程序API 绘图·strokeText微信小程序API 绘图·lineDashOffset微信小程序API 绘图·createPattern微信小程序API 下拉刷新

WXML节点信息

微信小程序API WXML节点信息

第三方平台

微信小程序API 第三方平台

开放接口

微信小程序API 登录微信小程序API 签名加密微信小程序API 授权微信小程序API 用户信息微信小程序API 微信支付微信小程序API 模板消息

微信小程序API 客服消息

微信小程序API 接收消息和事件微信小程序API 发送客服消息微信小程序API 转发消息微信小程序API 临时素材接口微信小程序API 接入指引微信小程序API 转发微信小程序API 二维码微信小程序API 收货地址微信小程序API 卡券微信小程序API 设置微信小程序API 微信运动微信小程序API 打开小程序微信小程序API 获取发票抬头微信小程序API 生物认证

数据

常规分析

微信小程序API 数据概况微信小程序API 访问分析微信小程序API 用户画像

自定义分析

微信小程序API 自定义数据上报

更新

微信小程序API getUpdateManager

拓展接口

微信小程序 拓展接口

多线程

微信小程序API createWorker

调试接口

微信小程序API 打开/关闭调试

工具

微信小程序工具 概览微信小程序工具 界面微信小程序工具 设置微信小程序工具 项目预览微信小程序工具 快捷键微信小程序工具 代码编辑微信小程序工具 程序调试微信小程序工具 特殊API的调试微信小程序工具 命令行调用微信小程序工具 HTTP调用微信小程序工具 代码片段微信小程序工具 第三方平台微信小程序工具 创建插件项目微信小程序工具 代码托管微信小程序工具 素材管理微信小程序工具 下载微信小程序工具 细节点微信小程序工具 beta版本下载微信小程序工具 Git版本管理微信小程序工具 体验评分微信小程序工具 npm支持

微信小程序 云开发

微信小程序云开发 基础

微信小程序云开发指引

微信小程序云开发 开发指引微信小程序云开发 控制台微信小程序云开发 初始化微信小程序云开发 数据库微信小程序云开发 存储微信小程序云开发 云函数微信小程序云开发参考信息

微信小程序云开发API 小程序端

微信小程序云开发API 初始化微信小程序云开发 数据库API数据库API database数据库API collection数据库API collection.doc数据库API collection.get数据库API doc.get数据库API collection.add数据库API collection.update数据库API doc.update数据库API doc.set数据库API doc.remove数据库API collection.count数据库API collection.where数据库API collection.orderBy数据库API collection.limit数据库API collection.skip数据库API collection.field数据库API db.command数据库API db.RegExp数据库API db.serverDate数据库API db.Geo数据库API 查询筛选条件数据库API 查询指令数据库API 更新指令数据库API get方法数据库API update数据库API remove微信小程序云开发API 服务端云开发服务端API 初始化云开发服务端API 工具类云开发服务端API 数据库服务端数据库API database服务端数据库API collection服务端数据库API collection.doc服务端数据库API collection.get服务端数据库API doc.get服务端数据库API collection.add服务端数据库API collection.update服务端数据库API collection.remove服务端数据库API doc.update服务端数据库API doc.set服务端数据库API doc.remove服务端数据库API collection.count服务端数据库API collection.where服务端数据库API collection.orderBy服务端数据库API collection.limit服务端数据库API collection.skip服务端数据库API collection.field服务端数据库API db.command服务端数据库API db.RegExp服务端数据库API db.serverDate服务端数据库API db.Geo服务端数据库API 查询筛选条件服务端数据库API 查询指令服务端数据库API 更新指令服务端数据库API db.createCollection服务端数据库API update服务端数据库API remove云开发服务端API 存储服务端存储API uploadFile服务端存储API downloadFile服务端存储API getTempFileURL服务端存储API deleteFile微信小程序开发文档-腾讯云支持微信小程序 联系我们微信小程序 Q&A微信小程序设计规范微信小程序设计规范(1) 友好礼貌微信小程序设计规范(2) 清晰明确微信小程序设计规范(3) 便捷优雅微信小程序设计规范(4) 统一稳定微信小程序设计规范(5) 视觉规范微信小程序源码分享微信小游戏开发手册 

微信小程序 优化建议


setData

setData是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下setData背后的工作原理。

工作原理

小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的evaluateJavascript所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。

evaluateJavascript的执行会受很多方面的影响,数据到达视图层并不是实时的。同一进程内的 WebView 实际上会共享一个 JS VM,如果 WebView 内 JS 线程正在执行渲染或其他逻辑,会影响 evaluateJavascript 脚本的实际执行时间,另外多个 WebView 也会抢占 JS VM 的执行权限;另外还有 JS 本身的编译执行耗时,都是影响数据传输速度的因素。

常见的 setData 操作错误

1. 频繁的去 setData

在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:

  • Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS 线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
  • 渲染有出现延时,由于 WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;

2. 每次 setData 都传递大量新数据

setData的底层实现可知,我们的数据传输实际是一次evaluateJavascript脚本过程,当数据量过大时会增加脚本的编译执行时间,占用 WebView JS 线程。

3. 后台态页面进行 setData

当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。

图片资源

目前图片资源的主要性能问题在于大图片和长列表图片上,这两种情况都有可能导致 iOS 客户端内存占用上升,从而触发系统回收小程序页面。

图片对内存的影响

在 iOS 上,小程序的页面是由多个 WKWebView 组成的,在系统内存紧张时,会回收掉一部分 WKWebView。从过去我们分析的案例来看,大图片和长列表图片的使用会引起 WKWebView 的回收。

图片对页面切换的影响

除了内存问题外,大图片也会造成页面切换的卡顿。我们分析过的案例中,有一部分小程序会在页面中引用大图片,在页面后退切换中会出现掉帧卡顿的情况。

当前我们建议开发者尽量减少使用大图片资源。

代码包大小的优化

小程序一开始时代码包限制为 1MB,但我们收到了很多反馈说代码包大小不够用,经过评估后我们放开了这个限制,增加到 2MB 。代码包上限的增加对于开发者来说,能够实现更丰富的功能,但对于用户来说,也增加了下载流量和本地空间的占用。

开发者在实现业务逻辑同时也有必要尽量减少代码包的大小,因为代码包大小直接影响到下载速度,从而影响用户的首次打开体验。除了代码自身的重构优化外,还可以从这两方面着手优化代码大小:

控制代码包内图片资源

小程序代码包经过编译后,会放在微信的 CDN 上供用户下载,CDN 开启了 GZIP 压缩,所以用户下载的是压缩后的 GZIP 包,其大小比代码包原体积会更小。 但我们分析数据发现,不同小程序之间的代码包压缩比差异也挺大的,部分可以达到 30%,而部分只有 80%,而造成这部分差异的一个原因,就是图片资源的使用。GZIP 对基于文本资源的压缩效果最好,在压缩较大文件时往往可高达 70%-80% 的压缩率,而如果对已经压缩的资源(例如大多数的图片格式)则效果甚微。

及时清理没有使用到的代码和资源

在日常开发的时候,我们可能引入了一些新的库文件,而过了一段时间后,由于各种原因又不再使用这个库了,我们常常会只是去掉了代码里的引用,而忘记删掉这类库文件了。目前小程序打包是会将工程下所有文件都打入代码包内,也就是说,这些没有被实际使用到的库文件和资源也会被打入到代码包里,从而影响到整体代码包的大小。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)