有幸得到老大给的 Velocity 大会门票,屁颠屁颠跑去听分享。下面是今天(第一天)的笔记。记得比较简略,凑合看吧。PPT 下载通道已经放出来了,感兴趣的可以自己跟踪一下。
UseThePlatform —— Web 组件介绍
分析者:来自 Youtube 的 Mikhail Sychev
感觉就是对 Polymer 和 Web Components 的科普。期待明天更详细的分享。
其实关于 Polymer,打开 Chrome 的
chrome://downloads/
查看源码,就能学到不少东西:CSS 变量、Shadow DOM、Polymer 等等。之前打算就这个写篇博客,一直没动手。
(略….)
搜索引擎性能优化的未来 —— 搜索极速浏览框架
分享者:来自百度的陶清乾
听到最后才发现,原来是搞了套自己的后端工具,你“打开”的页面,可能只是百度缓存、处理过的。(免责声明:理解可能有偏差)还提了下使用的 工具 MIP。
全流程优化
- 展现交互
- 加载策略
- 页面渲染
框架解决问题
- 创建容器视图,提升交互体验
- 异步加载渲染,提升页面渲染速度
- prefetch 实例,优化网络、服务开销
- 优化机制,优化细粒度模块速度
感知交互时间
点击搜索结果 => 页面响应
加速原理
传统页面
点击。连接。响应。基础渲染。内容渲染。组件加载。
加速
点击
A => 交互响应。基础渲染。。。。
B => 连接。响应。 。。。
。。。。内容渲染、组件加载
应用性能数据可视化
分享者:来自 mmTrix 的朱建锋
先是对可视化、性能等做了一些介绍,之后讲数据处理,科普了几种平均数,之后科普了各种常用的图(如雷达图、南丁格尔玫瑰图 etc.)。
前面
- 尽量使用抗干扰性更好的方法计算性能数据
- 标准差衡量性能标准
可视化是一个编码过程
- 基本的简单的图。
- 目的:表达数据。
请求理想时间小于 1s
- DNS: 50ms
- TCP shakes: 100ms
- SSL(https): 300ms
- Waiting for Response: 250ms(网络请求 => First Byte)
- 接收 Data: 300ms
Hulu 的 React / Redux 构架实践
分享者:来自“美国的爱奇艺” Hulu 的程墨
较基础,但对于 Constraints vs Conventions 相关的内容非常不错,很值得思考。
Challenges
- System Complexity
- Legacy code in jQuery & Backbone
- UI non-predictable
- Lack of component isolation
- Performance Bottleneck
- Initial AJAX roundtrip
Tech Stack
- Before: jQuery + Backbone + Ruby on Rails
- After: React + Redux + Node & Express
Other Notes
React APP = Keep Rndering
UI = f(state)
- Constraints vs Conventions
数亿级用户规模下的 React Native 应用实践
分享者:来自百度的雷志兴
做过一段时间的 RN,所以基本能听懂。
其他的内容,个人感觉可算干货满满。没提到热更新。
结合此前 58 同城 RN、携程 RN 等文章一起看,会更好的哈哈
手机百度
- 迭代周期: 4周
- 主要 features:数十个
- 开发工时:数千人时
- 跨部门,沟通成本高
- 业务种类多,集成成本高
- 过去的解耦方案
- APK 插件 / SDK
- Hybrid
- 迭代速度:native 的 5-8 倍
RN 工程实践
- 与现有业务融合
- Android 4.1 以上
- v0.32 以上不支持 iOS 7
- 降级兼容:随时回撤;AB Test
- 性能方面: 空间换时间,便利性换性能;减少重绘,减少通讯
- 统一交互协议:RN 和 Native 相互之间的调用
- 融入迭代流程
- 首先,前提是业务方明确提出 RN 产品需求,明确哪些能够做到
- 容灾方案:报错率较高怎么办?
- 开发
- 发布:打包、测试后由 PM 从平台发布
- 监控:一定要能够监控到 RN 层,尤其是 js 层的报错信息(Note:坑!!!!!!!!)
- 性能优化
- 通讯频繁 by design: js 足够的灵活性
- 易导致卡顿
- 事件频率高
- js 运行时间长
- UI 绘制频繁
- 初始化成本高
- 生成模块配置表
- ListView 优化
- View 无法复用,内存紧张
- DOM diff: 大量重新渲染
- 业务层优化:预留空白单元;大量内容时重新渲染
- 解决 1:删除非可视区 View
- 解决 2:模板复用(item 可能跳动、闪烁)
- 建议:产品进行限制,超过一定数量时重新刷新
- 动画
- 16ms,容易丢帧
- 实验特性 userNativeDriver: true —— 将动画数据算好全部发给 Native,减少通讯
- 启动速度优化
- 预初始化:APP 启动后,立即 instance Init,用户点击的时候,就可以直接开始 js 业务
- 首页业务多,instance 初始化过多,开销太大。
- 单 Instance 多业务:Component 方法加载业务,无法使用 global
- 按需加载:公用部分在初始化时加载,业务部分在交互时才开始加载
- 延迟加载、渲染
- 跨端方案对比
- RN 适用场景
- 超级 APP
- 体验平台级 APP
- Hybrid:...
- APK 插件:...
- RN 适用场景
- Summary
- 发版周期、开发成本和使用体验之间找到平衡
- 系统性工程:有机融入 APP
- ...
Q&A
- h5 和 RN 迭代的问题:两端齐头并进,各自开发
- Native Module 问题上报:....
- 非结构化 ListView 优化:RN 做的话,很难解决,结构样式尽量简单一些
- RN 版本升级应对:RN 的 持续交付。。。
双十一 Weex 会场极致性能优化
分享者:阿里的冯成晓、周婷婷
终于面对面接触到 Weex 分享了。很久之前逢阿里面试官必问 Weex,想必他们烦极了。
和百度同学关于 RN 的分享两场一起听下来,真的收获多多。
印象非常好的一点是,分享过程中,反复提到 W3C 标准,提到希望补齐和 W3C 性能优化相关的 feature。这种思路应该是非常棒的。
f(HTML/CSS/JS) = Native UI
- DSL(HTML/CSS/JS) -> Virtual DOM -> Renderer -> UI
- Transformer: DSL -> JS Bundle
- JSFramework: DOM Tree
- 模板编译,数据绑定
- Render:参照 Webkit
- Build Tree
- Compute Style
- CSS Layout (… Reflow, Relayout)
- Create View
- Update Frame
- Set View Props (… RePaint)
- Native View
优化
- 下载 js: 预加载
- 执行 js:单 context 共享
- 解析 DOM: Node & Tree 解析结合
- 渲染 UI: List & 异步渲染(内存复用,只会渲染可见部分)
- 全局污染治理 + JSCore 内存管理
性能优化指标
- 秒开率:加载时间+首屏时间 < 1s
- 加载时间:js bundle 加载时间
- ...
- Weex 会场页面数:1700+,占比 99.6%
- 主会场 FPS:低端机 53, 高端机58
- 动画、视频、直播、全景图都是 Weex
实战部分
- 列表过长,WebView 内存不好控制,容易 crash
- 加载 js bundle:本地 IO 最快
- APP 启动,预先下载 js
- 长连接通道 Push
- 全量/增量,被动/强制更新结合
- 预加载使用策略
- 根据业务特性斟酌
- 1700 个页面,由相同模板自由组合变成的
- 模块化,小粒度缓存
- 原来:1600 * 55 = 93 M
- 模块 + 配置:1700 5 + 30 10 = 8.8 M
- 但是模块 +配置这样的秒开率低了 10%
- 业务个性化预加载,根据进入场景下载:类似
- preload & prerender:
- dns-prefetch
- preconnect(DNS + TCP connect)
- prefetch
- subresources(depreciated)
- preload
- prerender
- js 执行
- 安卓下 V8 解析 js 耗时
- 减少 bundle size:去重,分离,通用组件内置
- 减少 VDOM 更新
- shouldComponentUpdate
- pureRenderMixin
- 动态数据并行预加载
- 点击时直接请求,然后存储在 storage 中(文蔺注:这块儿好像可以参考手机 QQ 家校 or 兴趣部落 React 的优化的文章)
- storage LRU 策略
- 首屏数据请求参数不固定?。。。
- jsbundle 走本地,效果如何?。。。
- 优化效果 80% 以上
- 首屏 UI 渲染
- 使用 list 代替 scroller
- 尽量减少布局嵌套
- 首屏以外的模板延迟初始化
- 新方案:requestIdleCallback
- 最佳实践
- 尽量 prefetch
- use list
- cell 细粒度拆分
- 减少首次加载内容
- 减少 js 大小
- 工具
- Xcode simulator
- Safari 10 Remote Inspector
- 性能指标优化流程(图)
- 发布基线
- 预发检测
- 线上监控
- 生成报表 <=== 业务达标基线
- 问题分析
- 开发修复
- 预发检测
- 。。。。
- Week 下一阶段
- W3C 性能优化 feature 补齐
- 性能 profile
- 完整开发模式
- 更丰富的交互体验
- 更丰富的 module 和 component