# 评测标准

诊断工具从启动性能、跳页性能、最佳实践、操作体验和网络性能五个方面进行评测。

部分启动性能指标含义与跳页性能指标相同，性能报告中区分首页和其它页面，可以更方便地排查启动流程中的问题。

## 名词解释

* 长任务: 执行耗时超过 50ms 的函数。
* 按需注入：仅注入当前访问页面所需的自定义组件和页面代码。
* 用时注入：开启「按需注入」特性的前提下，「用时注入」可以指定一部分自定义组件不在小程序启动时注入，而是在真正渲染的时候才进行注入。

## 指标清单

| 分类     | 指标                                  | 未通过标准                                         |
| :------- | :------------------------------------ | :------------------------------------------------- |
| 启动性能 | App 生命周期中的长任务                | 生命周期函数耗时 > 50ms                            |
|          | 避免非必要的全局插件                  | 存在全局引入的插件                                 |
|          | 使用「按需注入」                      | 未开启「按需注入」                                 |
|          | 首页重定向                            | 首页启动后立即重定向到其它页面                     |
|          | 内联 base64 图片                      | 首页 WXSS 中内联 base64 图片 > 10kB                |
| 跳页性能 | 同步 API 阻塞                         | 页面渲染前多次调用同步 API                         |
|          | 页面打开请求                          | 页面纯请求耗时 > 200ms                             |
|          | 声明但未使用到的组件                  | 页面访问过程中未使用到的组件                       |
|          | 页面生命周期中的长任务                | 页面生命周期函数耗时 > 50ms                        |
|          | 优先展示顶部搜索框                    | 新开页面未优先展示顶部搜索框                       |
|          | 进入详情页复用图片                    | 点击图片进入详情页未复用图片导致白屏               |
| 最佳实践 | 缓存 `storage` 结果                   | 首页重复获取相同键值的本地缓存                     |
|          | 合理控制本地缓存大小                  | 本地缓存占用超过 50%                               |
|          | 缓存 `systemInfo` 结果                | `getSystemInfo` 同步&异步接口调用超过3次           |
|          | 避免未处理的 `JavaScript` 异常        | 存在未处理的 `JavaScript` 异常                     |
|          | 脚本执行耗时过长                      | 页面方法耗时 > 50ms                                |
|          | 避免空的 `onPageScroll` 函数          | 存在空的 `onPageScroll` 函数                       |
|          | 缓存 `getLocation` 结果               | 30s 内重复调用 `getLocation`                       |
|          | 避免在 `scroll` 事件处理耗时逻辑      | 存在 `scroll` 事件处理耗时 > 10ms 或总耗时 > 150ms |
|          | 适当调整图片大小                      | 存在图片太大而有效显示区域较小                     |
|          | 传送现代格式的图片                    | 使用 `webp` 替代 `JPEG` 和 `PNG` 图片              |
|          | 对图片进行高效编码                    | 对图片进行适当压缩                                 |
|          | 使用视频格式制作动画内容              | 大型 `GIF` 转换为视频更为高效                      |
|          | 避免 `wx.on` 类型接口导致的内存泄漏   | 页面销毁时仍未移除 `wx.on` 类型监听器              |
|          | 避免 `observe` 类型接口导致的内存泄漏 | 页面销毁时仍未停止 `observe` 类型监听器            |
| 操作体验 | 轮播组件切换时复用节点                | 轮播组件切换时未复用节点导致闪白                   |
|          | 合理设置可点击元素大小                | 存在可点击元素宽高  50ms 或总耗时 > 150ms       |
|          | 自定义 `tabbar` 切换时无闪烁          | 自定义 `tabbar` 切换时存在闪烁                     |
| 网络性能 | 使用 `HTTP/2`                         | 有请求未使用 `HTTP/2`                              |
|          | 避免网络请求失败                      | 存在网络请求失败                                   |
|          | 避免网络状态码异常                    | 存在网络状态码异常                                 |
|          | 减少网络排队数量                      | 网络排队个数>50 或平均排队耗时 > 1500ms            |
