# 移动优化经验

## 网络加载

### 优化请求

- 优化请求包大小

* 代码压缩


* Gzip压缩


* 不同网络(2G/3G/4G/wifi)图片尺寸


* 合理减少Header字段/cookie


* MTU策略(1500字节)


* 首屏加载时间控制

+ 3s完成(5s为用户最大容忍度)


+ 网络平均速度(2.71Mb/s = 0.33875MBps(1Mbps=8MBps) = 346.88KBps)


+ 不超过1041KB,经验值200K(考虑打开响应、网络连接至少600ms)

- 减少请求次数(仅针对HTTP)

* 合并js、css文件、雪碧图

+ 移动端雪碧图(构建)


+ combo

* 避免重定向(一次重定向至少600ms)


* 避免重复资源请求


* 同时并行请求数量(android:4个,ios 5以后可支持6个)

- 解耦请求依赖

* 文件并行加载/依赖执行(构建+模块化)


* 首屏CGI提前(组件)


* inline首页必备js/css


* 异步加载非首屏

- 连接优化

* 支持keep-alive


* 网络时间

+ DNS(2G:3.85785;3G:1.60643;WIFI:0.986921;unknown:1.67838)


+ TCP(2G:2.33482;3G:0.743109;WIFI:0.550208;unknown:1.20898)


+ RTT(2G:2.57478;3G:0.608047;WIFI:0.444332;unknown:1.30601)

+ Tran(2G:14.0374;3G:60.1967;WIFI:70.8728;unknown:36.3655)

* DNS Prefetch

* HTTP2/SPDY

* TCP握手/TLS密钥协商

### 缓存策略

- Cache

* Browser Cache(一年)


* AppCache(选择)


* 离线包(native下必须)

- Web Storage

* localStorage


* sessionStorage


* nativeStorage(native,>=4.6,大数据)

- Cookie

- Web DB

* indexedDB(推荐)


* Web SQL

- 合理缓存CGI数据(local/ajax)

### 加载策略

- 首屏加载

* Server Render(React-Node)

- 按需加载(组件化)

- lazyload(图片、组件)

* 延迟加载图片


* 滚动加载图片

- Media Query

## 监控上报

### H5监控体系

- 成功/失败率

* 图片


* CDN文件


* CGI


* 直播/录播播放

+ 加载


+ 断流

- 测速(2G/3G/4G/wifi、组件)

* 首屏展示速度(首屏渲染)


* CGI测速


* CDN文件测速


* 图片测速


* 直播/录播播放

+ 加载


+ 断流

- 版本覆盖

* 离线包更新率

+ tdw:版本号、用户、环境等

* 离线包覆盖率

+ monitor

- 错误日志

* badjs


* tryjs

- performance

* timing(ios 8不支持)


* resouce timing(缓存/非缓存,手机暂不支持)

### 视频监控体系

- 直播播放

* 视频加载流程监控(playing/paulse/timeupdate)

+ 平均延时


+ 失败率

* 卡顿缓冲监控(timeupdate)

+ 卡顿缓冲时长


+ 卡顿缓冲次数(短流率)

* 视频异常监控(onerror)

+ 源文件不存在


+ 取回过程被用户中止


+ 下载时错误


+ 解码时错误


+ 不支持的音视频


+ 其他cgi请求异常引起的错误等

- 录播

* 视频加载流程监控(playing/paulse/timeupdate)

+ 平均延时


+ 失败率

* 卡顿缓冲监控(timeupdate)

+ 卡顿缓冲时长


+ 卡顿缓冲次数(短流率)

* 视频异常监控(onerror)

+ 源文件不存在


+ 取回过程被用户中止


+ 下载时错误


+ 解码时错误


+ 不支持的音视频


+ 其他cgi请求异常引起的错误等

* 单位录播时长等待监控

+ 录播播放时长


+ 下载等待时长

## SEO

- keywords/description

- 合理减少pages数量

- 减少图片/flash/弹窗

- 外链权重不高

- canonical/alternate

- 提交sitemap

## 渲染优化

### HTML

- HTML meta viewport(可以加速页面渲染)

- 优化DOM tree

* 减少html标签,避免不必要的嵌套


* 避免table


* 减少DOM深度

- 减少DOM渲染

* VirtualDOM(React)


* React-Native

### 动画

- 合理使用requestAnimationFrame

- 尽量使用css3

- 合理使用Canvas代替多DOM tree(5个) css3

- 高频事件(touchmove、scroll) lazy化(debounce.js)

- GUP渲染

* 大量的渲染(Canvas、WebGL、Video)


* 3D Transformed(transitions、3D transforms)


* Animated css属性(filters, masks, blend modes, reflections, opacity)


* position: fixed


* content overlapping existing GPU-rendered bitmaps

### repaint/reflow

- 避免重新设置图片大小

- 避免频繁的触发repaint/reflow

## 文件优化

### css样式

- 避免style标签

- 去掉expression

* 移除空的(多余的)选择器

- 合理使用Float

- 合理使用iconfont

- 值为0的属性不带单位(兼容性、压缩自动处理)

- 标准化浏览器前缀(构建)

- 减少font-size的申明(增加浏览器渲染计算)

- 异步css文件换成js文件(构建)

### js脚本

- 框架组件选择(zepto/react/vue/angular)

- 使用documentFragment(zepto已解决)

- 事件优化

* 事件代理


* 频繁事件优化


* touchsatrt、touchend(tap)代替click

- 使用mqqapi(http://mqq.oa.com/)

- id选择器

- 合理缓存对象(DOM、js对象、length)

- 慎用with

- 避免eval、Function

- 使用Join

### 图片文件

- 图片大小

* 压缩工具

+ 优图(tu.oa.com)


+ 智图(zhitu.tencent.com)


+ grunt插件

* 图片格式

+ webP


+ sharpP

- 减少图片使用

* css画图


* svg画图


* 合理iconfont代替图片(最后的选择)


* 避免使用bmp图片

- srcset + sizes(兼容性)

- 图片格式(webp > jpg > png(png8 > png24) > gif)

- 图片大小限制(10K,不超过30K)

- 图片尺寸限制