饿了么小程序容器首屏秒开优化实践
作者:邱计(纪学)
饿了么 APP 在阿里本地生活业务场景中作为用户体量最大、业务面最广的超级流量入口之一,其所承担的角色和重要程度不言而喻。随着小程序技术作为一种越发成熟和稳定的商业解决方案被越来越多的业务方选择使用和投放,在这样的大背景下本地生活的小程序容器应运而生。
小程序容器在饿了么 APP 中充当了所有小程序业务运行的基石,其性能和稳定性表现也成了大家所关注的焦点,本文将从首屏秒开的角度剖析过去一年小程序容器在饿了么 APP 中的性能优化实践。
现状简介
本地生活小程序容器(Lriver)是基于阿里技术体系下的小程序容器基础能力(Triver/Ariver)建设而成。作为本地生活小程序容器平台层,Lriver 灵活定制和支持了本地生活场景下的诸多能力包括 路由、包管理、导航栏、业务组件/API 扩展、数据存储、性能优化等,具体层级结构如下:
优化实践
我们先大致了解下小程序首屏展示的整个过程,优化前的小程序首屏加载过程基本是按照如下时序图步骤串行加载:
小程序首屏加载时序图(优化前)
在确定可优化节点及优化方案时基本是按照用空间换时间、串行改并发、预处理、特殊场景专向优化等方向和思路进行,可以看到下面(step3~step13)着色的节点均具备可优化空间。
针对可优化的节点经历过去一年的针对性优化结合小程序基础容器优化能力形成最终的如下加载时序图:
小程序首屏加载时序图(优化后)
1、包和包信息(前置预请求、APP 内预置、异步更新)
如上时序图所示,将小程序和 Appx 包通过 Orange 配置提前至 APP 启动后的闲时预请求后,放入缓存池中待后续打开小程序时直接命中包信息和包缓存,可省去网络请求耗时阶段直接进入包加载阶段。同时将一些小程序通用资源或框架(Appx1.0)预置在 APP 内,可以进一步提升包信息/包缓存的命中率。
在所有包信息加载过程中,会辅以过期更新策略提升触发小程序异步更新的时机,避免同步阻塞式等待。基础容器也会配合 ZCache 缓存管理能力支持闲时、定时、主动推送等更新。
2、Render 创建、资源加载(前置预创建、资源前置分阶段预加载)
在 APP 启动后闲时和小程序关闭后,均会触发 Render 的预创建及 Appx 资源的单独加载,放入缓存池中待下次打开小程序直接复用,且仅限当次打开的首个小程序有效(参考上述时序图)。
Render 预创建后会预先加载 Appx 资源(jsbridge.js、Appx.mini.js、Appx.mini.css、es6-promise.mini.js 等)。此阶段主要省去 Render 的创建和 Render 加载本地磁盘 Appx 资源的耗时过程。
3、Worker 创建、资源加载(前置预创建、资源前置分阶段预加载)
在 APP 启动后闲时和小程序关闭后,均会触发 Worker 的预创建及 Appx 资源的单独加载,放入缓存池中待下次打开小程序直接复用且仅限当次打开的首个小程序有效(参考上述时序图)。
Worker 预创建后会同时创建 2 个 JSContext(A 和 B)分别用来即时加载 JSCBridge.js 和 Appx 资源(af-Appx.worker.js)和后续打开小程序时加载具体的包资源(index.worker.js),B JSContext 加载完成后会将 A JSContext 中的 Appx 环境上下文拷贝到 B JSContext,以完成小程序整个 Worker 环境初始化加载。此阶段主要省去 worker 的创建和 worker 加载本地磁盘 Appx 资源的耗时过程。
4、首屏接口预请求(前置预请求)
通过前置首屏接口请求可有效缩短首屏数据加载时长,加快首屏秒开体验,具体过程如下:
5、首屏渲染(加载首屏快照)
通过将首屏渲染成功后保存页面 HTML 快照,在未来启动时首先渲染和展示快照,缩短小程序页面首次可见时间,提升用户体验。可以事先在小程序包中预置小程序首屏快照 HTML 文件,这样可以保证首次打开小程序首屏可见时间。
6、Appx 框架(Appx2.0)
目前本地生活小程序容器已适配支持业务方投放基于 Appx 2.0 开发的小程序,Appx 2.0 框架相比 1.0 从业务渲染性能和内存占用上均有大幅下降;从架构层面支持彻底解耦 render 和 worker 使得后续的极速启动和 Snapshot2.0 得以有效实现。针对 Appx 2.0 带来的改进饿了么端也将在后续版本中持续跟进优化期待整体性能比 Appx 1.0 小程序体验更好。
研发阶段和线上数据监控
容器会通过 核心链路性能埋点上报 和 首屏启动性能检测工具 这 2 个方面来监控小程序首屏数据性能表现。在研发阶段通过收集容器启动链路耗时信息,辅助发现小程序总体性能表现及各个阶段性能耗时占比,以便小程序上线前及时发现性能瓶颈点,有助于针对性排查优化。同时,饿了么端也支持结合 IDE 生成的小程序链接,借助阿里小程序性能检测平台上报性能数据分析性能瓶颈点并给出优化建议。
1、饿了么 APP 端性能辅助检测工具
2、阿里小程序性能检测平台
3、线上小程序平均耗时统计
以饿了么首页 休闲玩乐、丽人/医美 2 个小程序为例对比线上优化前后效果:
待优化问题及展望
问题:
1、Appx 2.0 各项性能需要做针对性优化;
2、Render 预加载能力仍待支持完善;
3、部分节点的优化针对端开放业务三方小程序并未完全支持。
以上优化项(Render/Worker 预加载除外)在过去一年中支撑饿了么 APP 端小程序业务在 618、717、双 11、双 12 等大促期间平稳运行,并带来了比较显著的首屏秒开体验提升。后续即将上线的 Render/Worker 预加载、Appx 2.0 的优化能力将会给本地生活小程序容器带来持续更好的秒开体验,并在接下来的端开放业务中逐渐惠及应用到三方小程序中去。
关注【阿里巴巴移动技术】微信公众号,每周 3 篇移动技术实践 &干货给你思考!
版权声明: 本文为 InfoQ 作者【阿里巴巴移动技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/3dc956b321510ba8abde3fab3】。文章转载请联系作者。
评论