电商RN项目秒开优化实践

标签: 电商 rn 项目 | 发表时间:2022-06-29 23:58 | 作者:程序媛徐婵
出处:https://juejin.cn/frontend

highlight: zenburn theme: cyanosis

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第34天, 点击查看活动详情

1. 包预置、预下载 、预渲染

可以申请 App 启动时预下载首包,建议拆包后申请,可以大幅度降低包下载时间。

预渲染提前渲染页面相当于从第一个阶段创建容器便开始优化。

2. 模块拆包,Tree-shaking,懒加载

模块拆分:可以拆分首包,可大幅提升包下载更新和加载性能。

懒加载:首屏不相关模块实现懒加载,减少加载时间。

Inline Requires 采用 inline require方式打包,可以把实际代码中没有使用的模块去除,减少 size。 加载模块的时机在实际真正使用到这个模块的时候,实现懒加载效果。 模块赋值时采用 get属性的方式进行赋值,可以在 inline require打包方式下实现懒加载。

开启 inline require 配置

  // metro.config.js
module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: true,
        inlineRequires: true,
      },
    }),
  },
};

3. 渲染引擎优化

V8 or Hermes 引擎性能对比

CodeCache:JS 预编译后的字节码产物,会缓存至磁盘,下次页面加载时可直接复用。目前 Hermes 已开启。

4. 减少 Native 通信

可减少一些 Call Native 的操作,同时将一些 ab 和静态数据增量提供批量获取的接口减少通信次数,以及减少 log 埋点的次数。

5. 预加载、引擎复用 + 深度预加载

预加载 Bundle Load:Native 提供 loadBusinessScript。 只加载 JS,不触发生命周期。

引擎复用 + 深度预加载:提前渲染备用,可自动生成 CodeCache,实际进入页面时可提升性能。

6. 前页信息复用、服务预取和缓存

前页信息复用:前页信息复用+后页骨架屏,前页跳转至后页时,可以采用前页信息提前渲染后页的部分内容。适合列表页->详情页等场景。

服务预取:框架已实现服务预取 Prefetch,可以在前页提前发服务预取后页信息。适用查询页 → 列表页、列表页 → 详情页等场景。

还有一类『在途服务预取』,是在进入下个页面时提前发下个页面的主服务,可以节省 200ms 左右的页面切换时间,在途服务仅在此次进入页面时有效。

Prefetch 不要滥用,因为会引起后端服务请求量上升,针对场景适当选用。

服务预取的缓存模式也支持长期过期时间:目前唐图已采用。场景是将之前的网络请求相应报文存储到本地 cache(磁盘文件缓存和内存缓存均支持)。页面加载时直接读取缓存,如果有缓存直接渲染 UI,同时发服务获取最新数据后再 diff 刷新 UI,同时更新缓存。

由于涉及公司内部 APP 隐私就不截图了

7. BFF 接口聚合、接口设计和性能优化

BFF 接口聚合:尽可能在 BFF 层聚合首屏所需服务,需要 case by case 制定方案。

接口设计和性能优化:梳理 BFF 接口的契约合理性,以及提出具体的性能要求。

即使有接口聚合,和复用前页信息并不冲突。

对于第三方或者外部直接跳转至详情页场景, 接口聚合可以直接发挥作用;

在列表页 → 详情页场景先使用信息复用,再一次性加载好完整页面,只要控制好 CLS(至少保证页面上半部分组件位置保持不变),对用户体验仍有大量提升。

竞品 - PDD:头图复用前页图片,页面下半部分一次性服务完成渲染。

1327cc2603aa7104fd4b412328e65d4.jpg

8. 分屏渲染、页面设计约束

分屏渲染:CRN 与 Native 通信性能不佳,导致多次渲染引发“动画片”效果,Dom 量大的情况下效果更差。建议改用 Promise.all 来同步渲染性能接近的异步请求。

页面设计约束:Layout 变化会导致页面抖动,直接影响 CLS 指数(见附录参考 Web 性能核心指标之一),对用户体验影响很大。

避免导致页面 Layout 变化的设计,至少页面的上半部分 Layout 不要有大幅变化的可能性;也可以利用前页信息,自动调整当前页面的骨架屏,避免页面 Layout 大幅变化,尤其尽可能避免页面上半部分的 Layout 变化。

竞品 - 美团:复用前页信息(通常是列表页到详情页),页面上半部分不会大幅变化,即骨架屏相对固定,不会存在额外加载新元素导致页面抖动的情况。

23f131ea885c707bd6fdfaf8ebba58f.jpg

cb4a98c5c5beb36c119929ba6a19d18.jpg

9. DomTree 预渲染

DomTree 预渲染,相当于客户端实现预加载直出


以上是本人在开发公司出海App使用rn方面所总结的一些经验,项目规模不大,如有错误,欢迎各路大佬批评指教,对 DomTree 预渲染感兴趣的话,下一篇我会单独介绍一下

相关 [电商 rn 项目] 推荐:

电商RN项目秒开优化实践

- - 掘金 前端
这是我参与「掘金日新计划 · 6 月更文挑战」的第34天, 点击查看活动详情. 可以申请 App 启动时预下载首包,建议拆包后申请,可以大幅度降低包下载时间. 预渲染提前渲染页面相当于从第一个阶段创建容器便开始优化. 模块拆包,Tree-shaking,懒加载. 模块拆分:可以拆分首包,可大幅提升包下载更新和加载性能.

基于RN+微应用打造多业务支撑的企业官方App_开发

- -
大型企业里不同C端业务大都是由不同的团队开发,所使用的技术以及页面风格都不相同,有的使用原生开发,体验较好;有的使用h5,体验较差. 不同的业务建设相互独立的App,独立分发推广,浪费资源不说,还显得很杂乱. 对于市场和需求的变更,很难形成合力. 市场需求变化非常快,越来越多的业务都在手机端处理了,以保险业务为例,用户办理了寿险的业务同时引导用户办理财产险业务,这个时候希望可以直接办理而不是去下载一个产险的App再去办理.

常见电商项目的数据库表设计(MySQL版) - 简书

- -
电商常用功能模块的数据库设计. 改进1:第三范式:将依赖传递的列分离出来. 比如:登录名<-用户级别<-级别积分上限,级别积分下限. 改进2:尽量做到冷热数据的分离,减小表的宽度. 用户登录表(customer_login). 用户信息表(customer_inf). 用户级别表(customer_level_inf).

reCAPTCHA项目

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 要说reCAPTCHA,就要先说一说CAPTCHA,全称是Completely Automated Public Turing test to tell Computers and Humans Apart,即全自动区分计算机和人类的图灵测试,也就是通常说的“验证码”,目的就是要把计算机和人区分开来.

项目集成项目管理之项目范围管理

- - CSDN博客系统运维推荐文章
7.1项目范围和项目范围管理.    项目范围:为完成具有规定特征和功能的产品、服务或结果,而必须完成的项目工作. 7.1.2项目范围管理的作用.    确定在项目内包括什么工作和不包括什么工作;由此界定的项目范围在项目的全生命周期内可能因某种原因而变化,项目范围管理也对这种变化进行管理. 7.1.3项目范围管理的主要过程.

电商之城

- 可可 - 《商业价值》杂志
原产地效应正在点亮越来越多的电商之城,这代表着电子商务正在逐步回归“商务”的本质. 从机场拿一份免费的手绘地图,和着有点潮湿的空气,足够开启对厦门这座海滨城市的造访. 从市中心到达位于厦门东北方向的软件园二期,只用了不到20分钟. 对于一个习惯了北京的拥堵和密集的人来说,一座被出租车师傅将半小时车程定义为“还挺远”的城市,从一开始就带给人惊喜.

项目的秘密——Programmers(29)

- allentranks - 西乔的九卦
载于《程序员》杂志2011年第9期. 从这一期起,开始在杂志上登出整P的大幅漫画,需要看大图的同学们,讯猛点击下图. 这个系列的漫画讲述程序员——这种神秘人类的囧事,故事多来源于我身边的程序员朋友,且以互联网开发背景为主. 如果你有什么可乐的关于程序员的故事、对话、代码,愿意通过漫画的形式分享,请给我发邮件.

绝望的项目——Programmers(21)

- leo - 西乔的九卦
载于《程序员》杂志2011年第1期. 这个系列的漫画讲述程序员——这种神秘人类的囧事,故事多来源于我身边的程序员朋友,且以互联网开发背景为主. 如果你有什么可乐的关于程序员的故事、对话、代码,愿意通过漫画的形式分享,请给我发邮件.

5种项目破坏者

- - InfoQ cn
Anders Abel是生活在瑞典斯德哥尔摩的一位软件开发者,他在自己的网站上撰写了一系列文章,箭头直指“项目破坏者”. 该系列的第二篇是《 项目破坏者分类》. Anders观察到的项目破坏者分五种:. 这种悲剧性的人物太没有安全感,一切都对他们充满了威胁. 为了克服他们的不安全感,这种破坏者会做出任何事,使出吃奶的力气,去强调一种特别难得的边界情况,因为他们正好就知道这种情况.

项目经理和Scrum Master

- - InfoQ cn
在博客上,大家对于Scrum Master和项目经理这两个角色依旧争论不休,许多评论员清晰地指出两者的不同,并表示两者不可并存,更不适合合二为一. Steve Hunton在Scrumalliance站点上发布了名为《 Scrum Master并不是项目经理的别名》的博文,他提到:. 与大众的认识相反,Scrum Master和项目经理这两个角色是完全不同的,也不应该混为一谈.