简介:快让我叉会儿腰~

作者:闲鱼技术-颂晨

背景

闲鱼前端页面的性能常常被人念叨,凡跳转、必跳鱼 的印象深入人心,部分页面甚至需要跳四五下才能打开,最近我们对闲鱼前端页面系统性的做了些优化,由于闲鱼前端技术栈相对多元,不同栈技术原理各不相同,优化方案也有所差异,本文主要介绍目前闲鱼占比较重的 Weex 页面的优化过程。

闲鱼 Weex 页面多以前端渲染为主,其打开过程与 Web 页面略微相近,大致分为以下几个阶段:

我们将「从开始加载(navigationStart)到屏幕首次 paint(绘制)像素内容」的这段时间称为 白屏时间(FP),将「从开始加载(navigationStart)到首屏内容全部渲染完成」的这段时间称为 首屏时间(FSP),受限于统计口径,目前 Weex 下的首屏时间是不包含图片下载及后续过程的。

优化前后

我们拿闲鱼的直播频道页和玩家频道页作为参考,通过录屏的方式看下优化前后的对比:

 

通过录屏分帧的方式我们统计了下这两个频道页在不同系统不同机型下的首屏时长:

可以看到,优化前 iOS、Android 主流机型上的首屏时间都要超过 2s,低端机甚至要 3-5s,优化后各机型的首屏时间均大幅下降,低端机首屏时长控制到了 2s 内,中高端机近乎直开。

拆解分析

确定优化方案前我们对现有的 Weex 页面做了拆解分析,从结果来看,以下几个因素对首屏时间的影响较大:

  1. Bundle 体积:不仅影响 Bundle 加载时长,同时也影响 Bundle 的解析执行耗时(低端机尤为明显)
  2. 首屏数据请求:页面渲染必须在首屏数据请求返回后,接口耗时直接影响首屏时间
  3. 首屏渲染范围:首屏渲染量直接影响渲染时长(低端机尤为明显)

优化方案

基于上面的分析调研,我们初步把优化方案定为四层:

按照预期优化效果,Weex 页面的打开过程是这样的:

体现在上述的四层结构中,主要包含以下几个优化点:

Bundle 离线


具体实现是将 Weex Bundle 以资源包为单位、以 URL 前缀为索引,通过一定的更新策略离线到客户端本地,之前的更新策略主要有
访问后安装、启动安装** 两种,对应的更新时机如下:

这套机制在容器层有统一的方案支撑,但是包命中率一直不高(25% - 55%),导致最终效果差强人意,分析后发现默认的更新策略(访问后安装)与页面回访率强相关,闲鱼的前端页面大都是频道导购型的页面,回访率天然不高,所以包命中率相对应也不会高。

本次优化主要是对更新策略进行了扩展,增加了 “闲时安装” 的更新策略:会在定时更新期间主动安装,如果安装后未使用,则会在一周之后淘汰;如果一周内使用过,则进入常规的更新淘汰机制(一个月未使用淘汰)。

在 “闲时安装” 的更新策略上线后,包命中率大幅提升(稳定后 90% 左右),页面性能也得到了显著提升:

不依赖首屏接口渲染的页面甚至可以达到「直开」:
 

数据预取

传统的首屏数据请求都是在 Bundle 解析完以后发起的,首屏数据返回后渲染页面,是个典型的串行过程。

本次优化中我们把这个串行的过程并行化了:

  1. 将首屏请求的配置序列化以后作为参数配置到了 URL 上,同时支持一些动态替换的参数(譬如经纬度、城市等参数);
  2. 在 navigationStart 的时候由客户端提取首屏请求配置,然后发起请求,并将结果以特定的 Hash Key(通过首屏配置生成的)作为索引存储到本地;
  3. 在业务层真正发起首屏请求的时候会通过 Hash Key 进行比对,命中后将数据取出来返回给业务层;

时序图如下:

特殊情况下的时序图:

具体的技术细节本文不再赘述,数据预取的优化策略上线后,首屏时间也得到了一定程度的提升,如下(iOS 侧由于各优化策略并行上线,没能做到单一变量采集性能数据,暂以 Android 侧为参考):

Bundle 离线、数据预取 的优化策略上线后,部分页面在中高端机型上逼近「直开」: 

渐进式首屏

渐进式首屏解决的是「最后一公里」的问题,因为在上了「离线包」和「数据预取」的方案后,我们发现:页面首屏时间一定程度上还是受限于首屏接口请求耗时,该方案就是为了降低用户侧的白屏等待时长,具体从以下三个方面着手:

  1. 以接口请求配置生成的索引对接口数据进行缓存

    • 当用户首次进入时,以骨架屏占位来等待业务数据加载;
    • 当用户非首次进入时,会根据接口请求配置生成的索引在本地缓存中查找缓存数据,并完成首屏渲染,同时并行发送接口请求,待新数据返回后,触发页面更新,完成最终渲染;

  1. 低端机降级方案

    为了用户体验能够更好,在此我们尝试了低端机降级优化方案。以直播频道为例:

    • 只对首屏 Tab 做缓存数据占位优化
    • 减少了低端机上首屏渲染展示数据量
  1. 图片渲染效果优化

     渐进式首屏带来的一个问题是界面更新时的闪动(特别是图片占大篇幅的时候),为了优化此问题,我们将图片从加载到出现的过程改为了渐显过渡,一定程度上消除了图片闪动的生硬感。
    

 

按需渲染

渲染页面作为首屏链路中的一环,不同技术栈、不同设备环境下,在页面首屏时间中也会有不同的占比。类Weex、RN 通过前端脚本映射原生组件的技术方案,渲染路径总结起来是:渲染前端 Virtual DOM -> 映射为 Native 指令 -> 将指令传输到 Native 侧 -> Native 执行指令完成渲染。在前三个步骤上,较重的业务逻辑或不合理的代码通常会带来较长的计算通信耗时,中低端机器上尤为明显。通过按需渲染可以有效解决这一问题。
按需渲染主要思路是通过只渲染首屏可见视图来最小化首屏渲染耗时。本次优化中,主要针对以下几个场景做了按需渲染:

  1. 多 Tab 情况下,对于有性能要求的非首屏 tab 页,做数据预加载、页面懒渲染处理
  2. 对带/不带回收机制的长列表做首屏只渲染可见条目,剩余懒渲染处理。可减少带回收机制列表的脚本计算、通信耗时,减少不带回收机制列表的全链路渲染耗时。
  3. 自建或使用轻量级组件替换非必要的重量级组件,如: xSlider。

优化上线后,鱼塘广场页中低端机型的首屏性能有了部分数据上的提升:

低端机上优化前端渲染阶段对比:
 

Bundle 瘦身

**
Bundle 体积一方面直接影响 Bundle 下载时间,另一方面也会影响 Android 端的渲染性能(耗时随 Bundle 体积增加 1-2ms/KB),我们在 Bundle 体积上的优化方案较为常规,包括:

  1. 通过 Webpack Bundle Analyzer 分析依赖,减少同 npm 包不同版本依赖
  2. 抽象公共模块,提高代码复用率
  3. 重构基础工具类库,支持按需加载打包

总结

闲鱼前端的性能优化暂时告一段落,优化过程中沉淀了较多的通用能力,像 Bundle 离线、数据预取、渐进式首屏等等,这些能力在后续会有更大的发挥空间,一些能力也会变得更加智能,譬如目前的数据预取是在 navigationStart 的时候发起的,这个时机已经比传统的页面加载时的时机提前了许多,但其实还可以更加提前,譬如可以在闲鱼客户端中常驻个 TaskSchedule,专门用来处理数据预取的 Task,同时可以结合用户的访问习惯做智能数据预取。

在前端性能要求越来越高的背景下,传统的 Web 加载流程已无法再满足性能优化的需要,所以出现了各种新兴容器 + 配套能力,所以下一代容器的标准形态应该是什么样的?

原文链接:https://developer.aliyun.com/article/776157?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

从“等等”到“秒开”再到“直开”,是什么让闲鱼社区相见恨晚?相关推荐

  1. 剑网3 最新服务器,剑网3:如何选择一个适合自己的区?不用再等新区开服了!...

    原标题:剑网3:如何选择一个适合自己的区?不用再等新区开服了! 大家好,我是斗士,随着指尖江湖的口碑越来越好,有越来越多的新玩家的加入,不知道大家有没有选择恐惧症,反正斗士在刚一开始选择服务器的时候非 ...

  2. 华为android 消耗流量,华为手机省流量三大法宝,最后一个别再傻傻的一直开着,很耗流量...

    原标题:华为手机省流量三大法宝,最后一个别再傻傻的一直开着,很耗流量 现在智能手机可以媲美电脑了,记得以前的流量包大家都是包月5M的,现在都是几个G的.以前5M都够用,现在几个G都不够用.有些华为手机 ...

  3. 剑指闲鱼?京东再战二手交易市场

    配图来自Canva可画 二手交易早已经不是什么新鲜名词了,其在我们的日常生活中也是随处可见.比如,每年毕业季来临,大学校园的角落里都会出现或大或小的跳蚤市场,毕业生会将无法带走但仍具有使用价值的物品进 ...

  4. 五年了,别再把务虚会开 “虚” 了

    这是头哥侃码的第210篇原创 上个月,为了配合公司的半年度战略讨论会,我特意留出一个周六的时间,与几位Leader在公司的会议室里开了一次部门半年度务虚会. 让我没想到的是,几位小伙伴在这次讨论过程中 ...

  5. 又怼上了!腾讯被假”老干妈”骗的瓜 ,字节跳动副总吃瓜后,再一次开怼!...

    点击"开发者技术前线",选择"星标" 在看|星标|留言,  真爱 作者:可可 开发者技术前线 原创 最近腾讯和老干妈之间的"乌龙"事件,闹得 ...

  6. java simplejson_JSON.simple首页、文档和下载 - JSON/BSON开发包 - OSCHINA - 中文开源技术交流社区...

    JSON.simple是一个简单的Java类库,用于解析和生成JSON文本.不依赖于其它类库,性能高. 示例代码: System.out.println("=======decode==== ...

  7. 闲鱼店铺怎么开通卖东西赚钱?

    闲鱼是个好地方,就像当年最初的淘宝一般,真是啥都有.近期吴昕和闲鱼火了一把,她把节目上钟汉良送的礼物标价60在闲鱼上卖了出去,网络上一片哗然.有网友扒出,吴昕已经在闲鱼上卖出了8000多件物品,已经赚 ...

  8. 年货来咯:精选年度最受欢迎干货,覆盖客户端、服务端、前端、数据、算法……...

    ????新年将至,年味渐浓.???? ????闲鱼技术年货,如期而至.???? 从2018年春到今天,我们共发布了216篇原创技术文章,开设在公众号.掘金.知乎.头条.facebook.twitter ...

  9. 欲瘦其包,必先探清其底细

    简介:包大小增量分析 作者:闲鱼技术-金喏 1.背景   不知大家是否注意到,闲鱼的包大小在随着服务用户的增多和新业务的持续迭代不断增长.在过去的半年时间,Android端包大小涨了43%,iOS端也 ...

最新文章

  1. 上海大学计算机技术 a股,这所上海大学短时间就成为211,实力强劲却不为人知,适合捡漏...
  2. Python 技术篇-百度语音API鉴权认证获取Access Token实例演示
  3. Can't access RabbitMQ web management interface after fresh install
  4. go语言有哪些劣势?
  5. 报名 | 想在硅谷近距离接触蚂蚁金服的CTO和一众技术高管?这个机会一定不能错过!...
  6. WordPress强制跳转https教程
  7. JavaScript 字典类
  8. Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源
  9. redio中插入php脚本,Jquery操作radio的简单实例
  10. 《大数据》第2期“专题”——数据开放与政府治理创新
  11. 【金融】【随机森林】使用随机森林对期货数据(涨跌)进行回归
  12. come back 继工作1年1一个月随想
  13. 《JavaScript高效图形编程(修订版)》——导读
  14. 计算机基础 软件系统与硬件系统
  15. python numpy库下载_python3.6下Numpy库下载与安装图文教程
  16. excel如何随机生成不重复的数字
  17. 怀旧服ouf头像插件_TukUI For 3.35 插件整合包 2019年怀旧服可用
  18. 基于图像特征点匹配的三维立体重建
  19. dpo指标详解买入绝技_DPO指标,DPO指标详解,DPO是什么意思? - 股票入门
  20. MQTT协议——MQTTX工具使用

热门文章

  1. Github年度人气最高的TOP10 Python项目
  2. 全套Python数据分析常用命令速查表!PDF文档限时分享
  3. inspinia中文管理后台_Bootstrap优秀模板-INSPINIA.2.9.2
  4. 西南交通大学计算机程序设计实验13,西南交通大学C++实验报告.doc
  5. access创建窗体特别慢_64位Access运行速度很慢的解决办法
  6. 冻结拆分_还不会固定表头?速来围观Excel冻结窗格实战教程
  7. SQLServer 查看耗时较多的SQL语句
  8. 闵可夫斯基和(Mincowsky sum)
  9. where/、trim/ 标签的使用
  10. [代码整洁]自我感悟