# 移动优化经验 ## 网络加载 ### 优化请求 - 优化请求包大小 * 代码压缩 * 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) - 图片尺寸限制