Taro小程序开发性能优化实践

我们团队在利用Taro进行秒送频道小程序的同时,一直在探索性能优化的最佳实践。随着需求的不断迭代,项目中的性能问题难免日积月累,逐渐暴露出来影响用户体验。适逢双十一大促,我们趁着这个机会统一进行了Taro性能优化实践,现总结如下,希望能为大家在日程的开发中提供借鉴,助力大促。

优化前性能表现

性能表现主要从两方面进行衡量,第一个是页面加载时间,其次是页面流畅程度。





页面加载时间我们通过两个维度进行量化,其一是关键点位打点记录时长,具体的点位有:

点位列表
点击tab
进入秒送频道分包
定位接口开始
定位接口结束
cms接口 开始
cms接口 结束
渲染cms 开始
渲染cms 结束
渲染入口球开始
渲染入口球结束
整体耗时

记录点位并计算时间间隔,统计出的量化时间表如下:

冷启动(初次加载小程序包)





热启动(已安装小程序包,退出微信后重新进入)





其二,实际上通过代码log打点存在很多问题,比如有些关键时间点没有时机进行上报,无法真实地反映出用户体验的实际情况,所以最真实的使用场景还是亲自掐表进行时间统计。

掐秒表:分段1(分包加载),分段2(缓存占位获取定位,发起cms请求),分段3(cms加载完成),总时长。

设备:中端(iPhone11)

冷启动:

热启动:



问题分析

根据统计结果,很可以看出容易,目前秒送频道页存在的主要问题主要集中于以下几个方面:

1.分包加载速度慢,导致首屏耗时偏长。

2.接口请求时长过长。

3.feeds渲染耗时偏长。

需要根据存在的问题,针对性地采取对应处理方案。

优化实践

1.切换Skyline渲染引擎

为了解决首屏耗时较长的问题,我们经过调研,决定采用Skyline引擎来进行优化。

Skyline是微信官方提供的渲染引擎,目标是进一步优化小程序性能,提供更为接近原生的用户体验。其使用更精简高效的渲染管线,并带来诸多增强特性,让 Skyline拥有了更接近原生渲染的性能体验。

Skyline 创建了一条渲染线程来负责渲染任务,并在 AppService 中划出一个独立的上下文,来运行之前 WebView 承担的 JS 逻辑、DOM 树创建等逻辑。





这种新的架构相比原有的 WebView 架构,有以下特点:

•界面更不容易被逻辑阻塞,进一步减少卡顿

•无需为每个页面新建一个 JS 引擎实例(WebView),减少了内存、时间开销

•框架可以在页面之间共享更多的资源,进一步减少运行时内存、时间开销

•框架的代码之间无需再通过 JSBridge 进行数据交换,减少了大量通信时间开销

而与此同时,这个新的架构能很好地保持和原有架构的兼容性,可以很大程度上降低首屏的渲染耗时。





在实际Skyline适配的过程中,我们对遇到的问题进行了记录:



1.利用backgroundPosition,backgroundImage和height裁剪背景图片的时候,backgroundPosition不可以使用calc运算符:

目的:裁剪图片从底部开始,向上,高度为gradientHeight的部分

原写法:

style={{
    backgroundPosition: `center calc(100% + ${getPx(gradientHeight)})`
}} >

适配写法:

style={{
    backgroundPosition: `center bottom -${gradientHeight}px`
}} >

2.在需要吸顶展示的场景,position: sticky不适用,需要改写:

目的:滚动到距顶部statusBarHeight的时候吸顶展示

原写法:

style={{
    position: sticky,
    top: statusBarHeight,    
}} >

适配写法

<ScrollView type="list">
    <StickySection pushPinnedHeader={false}>
        <StickyHeader offsetTop={statusBarHeight}>
            <View className={styles.view}>
              ...
            </View>
        </StickyHeader>
    </StickySection>
</ScrollView>

3.子视图节点有用到position: absolute的场景,根结点需要设置position: relative

4.在视图设置全圆角的时候,单独设置某一变的颜色,会使圆角失效:

.loading {
    border-radius: 100%;
    border-top-color: transparent;
}

现象:







5.position: fixed属性失效:使用position:

absolute和position: relative按需代替

6.z-index只在同层级之间有效,跨层级无效:

如果实在无法提高层级,可以考虑使用: root-portal组件

7.所有节点默认是 relative,可能导致absolute不准/margin-top无效:

按实际情况调整UI。如果遇到节点下的第一个margin-top无效,可以在前面加一个占位的的view

最终适配完成后的优化效果如下

冷启动:







热启动:







2.资源位延迟加载

feeds楼层存在着渲染时长偏长的问题,最主要的问题集中在店带品楼层上:





该楼层带有商品列表,列表中的商品每一个都会渲染一个资源位,数目在15到20个不等,这样的楼层会下发13个左右,且每次都会在接口下发后一次性全部渲染,导致渲染的资源位数目暴增。

本次优化对商品资源位的加载进行了优化,首屏只最多渲染6个:





其余商品在滑动触底是懒加载。

<ScrollView 
 ...
 onScrollToLower={handleScrolltolower}
 ...
/>



const handleScrolltolower = useCallback(e => {
 if (loadMoreImg.current == false) {
 loadMoreImg.current = true
 //加载剩余图片
 setDatasource)
 }
}, [loadMoreImg])

以此方式来减少渲染工作量,提高渲染速度。底部的feeds商品资源位也采用相同的处理方式,首屏最多加载6个:





3.多团队沟通优化

除了使用懒加载的方式,我们也积极与产品和UED团队沟通,针对店带品的使用场景沟通解决方案。最终确定可以将首屏下发的楼层数从13个调整为9个,进一步降低渲染压力,提升feeds部分的渲染速度。

在实际优化实践中,往往与其他团队进行沟通,是最有效的优化方式,大家可以多借鉴一下。

4.图片资源优化

图片资源尺寸过大,会导致图片下载缓慢,资源位白屏,用户体验差。以往网管在进行商品图片下发的时候,无论是店带品楼层的商品还是商品详情页展示的商品大图,采用的都是同一套尺寸较大的图片,这就导致在店带品楼层商品列表过多时,图片下载过程等待时间过长。经过与后端团队,产品和UED团队积极沟通,确定了一套3尺寸图片方案:





产品配置图片的时候,会配置大、中、小三种尺寸的图片,网关在下发时会根据资源位的类型区别下发,针对店带品楼层、feeds商品这种楼层,仅下发小尺寸图片,以减小接口请求数据量以及图片下发时间,极大地提高了图片夹杂速度。

5.接口请求逻辑改造

秒送频道页涉及到两个接口请求,分别是主接口和feeds数据接口,之前因为代码结构的原因,两个接口采用了串行请求的方式做请求。这次的优化经过方案评审,将串行改为并行,并将两个接口返回的结果进行隔离,分批渲染,从而降低了整体接口请求的时长。

优化成果

经过一系列优化,在接口请求总时长,feeds渲染提升非常明显,首屏加载速度有了很大提升:





根据掐秒表的结果,也能够最直观的感觉出整体开启速度的提升:





结语

Taro小程序开发的性能优化实践,不仅涉及到前端代码优化,还涉及到了多个团队之间的沟通配合,好的代码习惯也不是一朝一夕就能养成的,优化也需要日积月累,不断持续地推进,希望这篇文章可以帮助到大家,助力大促期间的用户体验改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jangow-01-1.0.1靶机

靶机 ip&#xff1a;192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式&#xff0c;我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个&#xff0c;按回车。 继续选择第二个&#xff0c;这次按 e 进入编辑页面 接下来&#xff0c;…

03.HTTPS的实现原理-HTTPS的工作流程

03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…

阿里云人工智能ACA(五)——深度学习基础

一、深度学习概述 1. 深度学习概念 1-1. 深度学习基本概念 深度学习是机器学习的一个分支基于人工神经网络&#xff08;模仿人脑结构&#xff09;通过多层网络自动学习特征能够处理复杂的模式识别问题 1-2. 深度学习的优点与缺点 优点 强大的特征学习能力可以处理复杂问题…

MySQL和HBase的对比

Mysql &#xff1a;关系型数据库&#xff0c;主要面向 OLTP &#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持 sql &#xff0c;支持主从、 Group Replication 架构模型&#xff08;此处以 Innodb 为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase &am…

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义&#xff0c;主要体现在以下几个方面‌&#xff1a; 1、‌数据安全性‌&#xff1a;数据摆渡系统通过加密传输、访问控制和审计日志等功能&#xff0c;确保数据在传输和存储过程中的安全性。 2、‌高…

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…

未来网络技术的新征程:5G、物联网与边缘计算(10/10)

一、5G 网络&#xff1a;引领未来通信新潮流 &#xff08;一&#xff09;5G 网络的特点 高速率&#xff1a;5G 依托良好技术架构&#xff0c;提供更高的网络速度&#xff0c;峰值要求不低于 20Gb/s&#xff0c;下载速度最高达 10Gbps。相比 4G 网络&#xff0c;5G 的基站速度…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

STL格式转换为GLTF格式

STL与GLTF格式简介 STL格式 STL&#xff08;Stereo Lithography&#xff09;文件是一种广泛使用的3D打印文件格式&#xff0c;由3D Systems公司开发。它主要用于存储三维物体的几何信息&#xff0c;常用于立体光刻等3D打印技术。STL文件通常只包含物体的表面几何形状&#xf…

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;1&#xff09; 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点&#xff0c;并基于Argo搭建一套完整的DevOps CI/CD服务平台&#xff0c;包括Argo CD…

数据结构经典算法总复习(下卷)

第五章:树和二叉树 先序遍历二叉树的非递归算法。 void PreOrderTraverse(BiTree T, void (*Visit)(TElemType)) {//表示用于查找的函数的指针Stack S; BiTree p T;InitStack(S);//S模拟工作栈while (p || !StackEmpty(S)) {//S为空且下一个结点为空&#xff0c;意味着结束遍…

前端知识补充—CSS

CSS介绍 什么是CSS CSS(Cascading Style Sheet)&#xff0c;层叠样式表, ⽤于控制⻚⾯的样式 CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯的样式和结构分离 基本语法规范 选择器 {⼀条/N条声明} 1&#xff09;选择器决定针对谁修改…

Spring Security 6 系列之九 - 集成JWT

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级为6.3.0&#xff0c;关键是其风…

【Go】context标准库

文章目录 1. 概述1.1 什么是 Context1.2 设计原理1.3 使用场景1.4 Context 分类核心:Context接口2. 源码解读4个实现emptyCtxTODO 和 BackgroundcancelCtxWithCancelcancelCtx.propagateCancel 构建父子关联parentCancelCtx 获取父上下文中的内嵌cancelCtxcanceltimerCtxWithT…

Windows和Linux安全配置和加固

一.A模块基础设施设置/安全加固 A-1.登录加固 1.密码策略 a.最小密码长度不少于8个字符&#xff0c;将密码长度最小值的属性配置界面截图。 练习用的WindowsServer2008,系统左下角开始 > 管理工具 > 本地安全策略 > 账户策略 > 密码策略 > 密码最小长度&#…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

MT6765核心板_MTK6765安卓核心板规格参数_联发科MTK模块开发

MTK6765安卓核心板是基于联发科高效八核处理器平台开发的一款强大硬件解决方案。这款核心板的核心是采用12纳米工艺打造的MTK6765 CPU&#xff0c;具备四个主频高达2.3GHz的CORTEX-A53核心和四个主频为1.8GHz的CORTEX-A53核心&#xff0c;提供了卓越的处理性能。用户可以根据需…

Linux Shell 脚本编程基础知识篇—shell 运算命令详解

ℹ️大家好&#xff0c;我是练小杰&#xff0c;本文继续Linux shell脚本编程的基础知识内容&#xff0c;接着讲算术运算命令的详细操作~~ 复习&#xff1a;【shell简介以及基本操作】 更多Linux 相关内容请点击&#x1f449;“Linux专栏”~ 文章目录 let运算命令的用法let 的高…

Nginx单向链表 ngx_list_t

目录 基本概述 数据结构 接口描述 具体实现 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源码 和 《深入理解 Nginx&#xff1a;模块开发与架构解析》 基本概述 Nginx 中的 ngx_list_t 是一个单向链表容器&#xff0c;链表中的每一个节…

KVM虚拟机管理脚本

思路&#xff1a; 在/opt/kvm下创建一个磁盘文件&#xff0c;做差异镜像&#xff0c;创建一个虚拟机配置文件&#xff0c;做虚拟机模版 [rootnode01 ~]# ls /opt/kvm/ vm_base.qcow2 vm_base.xml创建虚拟机的步骤&#xff1a;首先创建虚拟机的差异镜像&#xff0c;然后复制虚…