阿里巴巴技术协会(ATA)精选Hybird文章

该文章来自于阿里巴巴技术协会(ATA)精选文章。
IO 优化
今天 去啊 App 5.1.1
已经发布了,航旅 Hybrid 混合架构有了更进一步的落地,这轮优化目标是搞定H5真正的“无缝秒出”。
先来看效果,去啊App 2G 网络下购买国际机票,30秒完成,除了搜索入口页,列表往下到付款页的前端都是H5 Page,大家感受一下:
[图片上传中。。。(1)]
目测性能是可观的。尽管H5包的离线化隔绝了弱网对秒出的干扰,设备本地 IO 耗时也是不能忽视的,算上zip的解压缩,仅在设备本地 IO 完全一个 HTML(包含其携带的资源文件)也会达到秒级的耗时,在iphone5上也会有0.5秒左右的白屏时间。
另外,HTML 本身的优化依然无法绕过,WebView 里 JS 的运行效率通常是 Mobile Browser 里的四分之一。所以 JS 必须尽可能靠后的介入渲染,CSS 必须尽可能靠前的介入渲染。而在当下前端开发习惯来看,页面通常会至少阻塞加载一个种子文件(比如kissy),而在Mobile设备中,哪怕是无干扰Dom的JS阻塞运行都会带来0.3秒左右的白屏延时。
所以,H5容器的IO优化和HTML渲染提前是本期改造的重点,即:
H5 容器加载资源的 IO 优化:干掉zip包的即时解压,离线包更新后立即解压散列到SD卡,每次创建 View 时直接从设备读文件,本地文件管理依然基于标准的H5包规范。
HTML 本身的页面优化,CSS 提前,JS 置后。

“CSS 提前和JS置后”的动作是由工具来完成。即只要构建工具统一,开发者不需要关心如何摆放脚本最优,只需关注实现业务逻辑即可,举个例子,JS 置后的做法是这样:
[图片上传中。。。(2)]
其实无非是将同步的脚本改成异步。先保证带样式的页面框架秒出来,然后去执行 JS。从性能数据上甚至看不出差别,但从感官上的提升非常明显,我宁愿让你先看到界面,而不是白屏。
IO 优化(续)
从策略上,做到这两点足够应付大多数场景,能保证页面任何时候能秒出来。但在我们整个 Hybrid 架构中,我们设计了比较灵活的 H5 离线化,即用虚拟域来确保在线离线的一致,比如酒店团购H5页面,浏览器扫码打开是一个在线页面,用去啊App扫码进来就是一个离线页面,同一份代码,一个走网络加载,一个走本地加载:
[图片上传中。。。(3)]
这样设计主要是为了做线上线下的开关切换,紧急问题可随时配置到线上页面,线上页面是可以随时部署的,离线页面则涉及到推包。为了做这层开关,就会带来判断文件是线上还是离线的问题。
因为H5容器虚拟域的代理层会引导 WebView 去本地而不是网络读文件。如果读不到本地文件,再创建一个HTTP请求去对应的线上请求文件。如果通过 IO 一次再判断本地是否存在文件,显然实际的 IO 次数依然降不下来(所有的资源文件请求都必须要 IO 一次手机硬盘),为了降低实际 IO 次数,我们针对每个 H5 离线包生成一个本地资源文件列表(cache_info.json),并同时将域名路径和文件路径做成了映射 Map,这个映射表读入内存后备用,涉及到H5的访问,用这个 Map 过滤下就能直接找到要读的文件位置,Map 匹配不上就直接创建HTTP从网上取文件了,这样可以避免无必要的 IO。
[图片上传中。。。(4)]
AngularJS 在移动端的加速
去啊 Hybrid 中存在大量的列表页,比如上面的团购和视频中国际机票的例子,AngularJS 是最适用于这种场景。但 AngularJS 目前没有专门针对 Mobile 做优化,而在 Mobile 设备里,hashchange
带动数据模型data-model
的变更,进而通过View
来渲染。首次渲染稍慢,因为要等Model
准备好才出视图,无论如何界面也秒不出来(从hashchange
到出界面至少0.8 秒)数据结构在稍微复杂点,立即破1秒,当然这个时间是伴随着首次加载构建DOM的干扰。
几点改造:
AngularJS 种子文件异步载入
非数据关联的HTML一律预装在页面
首次加载干掉任何影响页面抖动的 HashChange
基础数据的离线化(比如城市列表)

这几点无非是让首次渲染能尽快的展现,接下来 OPOA 中的编程就是 AngularJS 所擅长的了。
离线包里的 TMS 如何载入
我们知道 AWP 只支持静态 HTML 的发布,这没什么好解释的,毕竟,高性能要求更简单粗暴且有效的缓存,全静态就可以全缓存,尤其是在移动终端的破网里面,缓存尤其重要,但 TMS 动态内容如何生成?我们都知道 AWP 平台提供了一个
的标签(使用说明),TMS 变更后就重新生成一份HTML 推送到CDN上。
那么问题来了,离线包里怎么做?
我们团队的同学写了offline-tms-parser模块,clam会将
标签构建:

构建为:
<script src="http://trip.taobao.com/market/trip/h5_offline_service.php? callback=handle_tms_fragment&src=http%3A%2F%2Fabc.php" charset="gbk"></script>

这样,在离线包里的 TMS 内容就和 H5 页面完全分开了,毕竟 TMS 由于变更频繁,是没办法直接做离线化的。但上面这段脚本显然会阻塞页面渲染,所以offline-tms-parser
提供了异步的版本,即将:

构建为:
<script id="tms_fragment_1">get_tms_fragment("http://abc.php", "gbk", "tms_fragment_1");</script>

然后在 H5 页面顶部塞一个get_tms_fragment
的实现即可。
如此,基于 AWP 平台开发业务将不受任何影响,工具帮我们处理好 TMS 和 H5 页面的百分百解耦,离线包里也可以大量使用 TMS 了。
尽管如此,也必须不能滥用 TMS,代码逻辑层面的 View 和 Data 的解耦仍然是必须要做的。

让人期待的 grunt-kmb
本期优化面向 H5 离线容器的代码改造的重点是上面这几项,但还有一项激动人心的变化: grunt-kmb,没错,构建流程也需要瘦身和简化了。
grunt-kmb
是团队另一位同学正在开发的 grunt-kmc 的替代方案。相比于 grunt-kmc 基于正则匹配的模块解析,grunt-kmc 完全基于 uglify-js
提供的 JavaScript 语法解析树(AST),先看对比:
grunt-kmc 的速度:


grunt-kmb 的速度:

整整一倍的提速,太让人垂涎期待了。
What's Next
本期的优化没有多少高科技的东西,大都是体力活,将技术做透。好的体验真的是靠点滴的积累,需要花时间去磨。
其实从去啊App Hybrid 刚开始设计并做第一版优化到现在已经有半年多时间,这期间离不开客户端同学的全心投入,因为 H5 的优化必须借助高性能的 WebView 容器,但靠 H5 或者 Web 技术本身无论如何是无法做到秒出的。再配上《高性能网站建设指南》里零碎的优化技巧,H5 在 Hybrid 中完全可以做到秒出,再配备离线包动态推送和埋点采集等基础设施,Web 技术的瓶颈在 Mobile 中就能获得一定的突破。
我在这次集团前端技术峰会上的汇报
里,提到过我们面临的挑战:
[图片上传中。。。(7)]
去啊 App 是介于工具化的钱包App和运营化的手淘App之间,既有营销活动,也有工具化、流程化的 PageFlow。将标准化的 PageFlow 的性能做到极致,接下来的挑战就是如何将运营活动也做到智能的推送,完成这类页面的离线部署。
当然,活动页面的离线化部署目前来看不是我们面临最急迫的难题,最棘手的是数据打通的问题:
看这个场景,在钱包App做了一个引流的入口,唤起了去啊App,并定位到机票搜索结果页:
[图片上传中。。。(8)]
目前我们很难跟踪唤起的效果,手机里的App是信息孤岛,很难通过简单的传参来把跨 App 的 PageFlow 串联起来。即使参数能带过来,但身份信息、登陆状态和账号关联能否也能带过来呢,每一项都是很有挑战。
我在前两天给航旅的新人培训上,分享了我理解的《Mobile First》
,这段话是值得分享给大家一起共勉的:
内聚的 App 和散列的 Web 似乎是一个不可调和的矛盾。企业倾向于认为只有提供越来越多地功能,才能满足用户不断膨胀的需求,但又会打破原有应用的简便易用。当两者无法调和,信息膨胀到必须散列到不同的端时,通过 Web 技术将这些信息孤岛关联起来就显得至关重要。

所以,我们之前所做的所有技术的优化,都是在为构建无线“前端/终端”技术体系夯实根基,所以这一轮无线All In 从某种意义上看是一种原始积累,第二轮无线All In才会迎来真正的非标商品的个性化、多元化时代。这时我们的技术体系将着重解决这几类问题:
千人千面,重点解决面向不同人群做手机里的定制化功能的问题
无线大数据,重点解决打破App间的信息孤岛,让跨端的数据化运营更加高效、可靠
无线开源,让 B 商家参与进来,像手淘一个(Native)商品详情页通吃所有商品的时代很快就会被更个性、多彩的非标商品打破,这时,大量垂直领域的产品模式设计更多要靠商家参与,而不是我们自己那几个产品经理,所以,更开源、更自由的手机店铺,闭环服务才是王道。

说到闭环,去啊的机票购买流程,是无线端闭环的经典案例:
[图片上传中。。。(9)]
这个例子是从钱包的入口开始购机票流程,通过短信、Push、下载、唤起等操作,将用户捣腾到去啊App里(整个过程体验流畅,估计你也很难分清楚哪些Page是H5的、哪些是Native的吧)。
So,开源 + 闭环,是我理想中的无线 Hybrid 技术的终极状态,去啊 Hybrid 技术积累也才刚刚开始。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,887评论 25 707
  • 社交网络日新月异,需要更快,更灵活的技术架构才能满足用户日益丰富的媒体需求,Hybrid App架构具备了快速发布...
    架构师ArchSummit阅读 1,102评论 0 5
  • 0. 前言 前面有被用户投诉 APP 流量消耗厉害: 于是乎考虑了流量方面的问题。暂时 APP 中涉及流量的几个方...
    zyl06阅读 23,975评论 5 62
  • 我们的故事,会让所有的爱情都黯然失色吧。 谢谢你,让我经历了最幸福,飘渺般却几乎就快要触及的那一瞬。 我不会忘记那...
    食盐君阅读 256评论 0 1
  • 为什么会喜欢许嵩呢?没有理由!我不是喜欢他的第一个人,也不会是最后一个,在众多的明星中他是那么的不同,别人称嵩哥是...
    杨哈哈哈阅读 177评论 0 0