移动优化经验

# 移动优化经验

## 网络加载

### 优化请求

- 优化请求包大小

* 代码压缩

* 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)

- 图片尺寸限制

原文地址:https://www.cnblogs.com/timssd/p/7441155.html