我们对进入整个详情页进行分析,整个页面的结构大致如下

菩提祖师
• 阅读 2167

首先,我们对进入整个详情页进行分析,整个页面的结构大致如下,主要包含三个部分:基本信息,可视化图和时间轴。时间轴内部包含时间轴的详情信息,包括表格和几种类型的可视化图等,内部比较重。如图所示:

图片描述

我们点击录制,查看进入页面的性能图:

优化点1
可以看到,渲染当前页面的耗时将近1.2s,我们看看到底是哪里出现了问题。对渲染部分进行放大,我们发现在渲染时间轴的过程中,大部分时间耗费在了每个时间节点详情内容的展示上面,但是默认状态下,他们是进行隐藏的。也就是说,我们进行了N个节点的不必要的渲染,只需把他们干掉就好了。

图片描述

查看代码,发现是以下位置导致的,我们进行了一个展开盒子的封装,类似这样:

<Box data={data} border collapse loading={loading}>
<AlertDetail />
</Box>
在非展开状态下,我们依然对内容进行了渲染,只是使用样式进行了隐藏,但是这样React仍然会进行虚拟dom的渲染和计算,在这里我们对其进行改造,让其只在展开时进行渲染,并尽量缓存渲染的结果。修改完成后,我们会发现,Scripting由之前的880+ms变成了670ms减少了200ms左右:

图片描述

优化点2
我们继续看,会发现页面初始化时,详情部分会有大量的Evaluate Script耗时,主要是耗费在告警详情右侧的分类及各分类下的可视图及详情引起的。

clipboard.png

我们可能会想,这里在初始化时并没有进行渲染,为什么仍然会耗费时长进行计算呢?继续追查我发现原因在这里:

clipboard.png

在整个详情组件中,我们对包括http,tcp等所有类型的组件进行了引用,然后根据其类型进行组件的匹配,在各个组件中可能包含了每个类型对应的定义、分类和计算等等等等,不仅增加了加载时间,更延长了初始化时间,显然我们这么做是不对的。

在此,我们可以使用懒加载方式对其进行优化,仅展示其对应类型的图,避免了不必要的资源浪费和计算时间。

clipboard.png

修改之后,我们再次进行性能测试,发现在进入页面时,详情组件的耗费时长由260ms变为不到2ms:

clipboard.png

而Scripting由之前的670+ms变成了415ms减少了250ms左右:

clipboard.png

至此,进入页面的耗时已由最开始的1.2s左右变成了现在的0.7s左右。

更新优化
我们在点击时间轴查看详情时,会进行几个操作。关闭其他已开启的详情内容,展开当前详情内容,根据当前的类型进行对应类型的详情内容展示,上边已经提到过。这个过程会涉及到React的update操作,我们来对这个过程进行一下优化。

优化点1
首先我们点击录制按钮,然后点击展开,并对其进行录制。我们会发现以下的结果:

clipboard.png

点击展开按钮,Timeline组件进行了多次重复渲染,显然这是不应该的,我们来看下是哪里导致的。我们看到整个时间轴组件中,有这样一段代码,在时间轴组件中使用connect连接了timeline和alertList两个数据,其中,alertList数据是详情内种中对应的告警列表。两组数据对应的更改都会映射到组件的更新,比如时间轴的展开收起,以及alertList请求,请求成功及失败等。

clipboard.png

按理来说,alertList对应的请求,仅对应到当前展开内容的更新即可。因此,我们对此有几种修改方案:

时间轴组件中弃用对alertList的引用,以保证alertList不会牵连到时间轴组件整体更新
将时间轴的渲染和详情渲染进行分离,向其传递各自对应的数据,通过PureComponent来控制更新
使用shouldComponentUpdate进行优化
在此我们采用第一种,避免alertList对整个组件的影响。

我们会发现,点开详情后,整个timeLine只进行了一次大更新,详情的更新只在展开的组件中进行。

clipboard.png

优化点2
我们会发现,在对某一个时间点进行展开时,整个list列表的节点都进行了更新,如下图所示。显然这样的性能耗费是及其大且不重要的。假如列表的内容很多,那极有可能造成大量的更新导致页面卡死。

clipboard.png

因为其他的list列表节点都引用了alertList这个prop, 当其进行改变时,所有的节点都会进行更新,所以我们需要使用shouldComponentUpdate手动对其进行优化:

// 当开关状态变化时,才从新渲染,否则不需要
shouldComponentUpdate (nextProps, nextState) {
const opened = _.get(this.props, 'open')
const willOpen = _.get(nextProps, 'open')
if (opened === willOpen && !willOpen) {

return false

} else {

// 类似pureComponent进行浅比较
return !_.isEqual(this.props, nextProps) || !_.isEqual(this.state, nextState)

}
}
再次进行录制,我们发现只要当前Item进行了更新,整个Timeline更新时间缩短到不到40ms,极大的增加了体验。

clipboard.png

其他优化过程与上面类似,不再赘述。

总结
通过配合performance工具进行一步步优化,整个页面的渲染和更新性能有了极大的提升,我们也借此知道了在平时书写代码过程中需要注意的问题。我们简单的做一下总结:

避免非展示状态的不必要的渲染
必要时,手动进行懒加载以避免大型模块对页面进行营销,避免加载不必要的模块
保证展示组件props的纯净性,避免因其他props的更改导致组件进行更新
必要时,可使用shouldComponent进行手动优化
平时可通过PureComponent来避免不必要的组件更新

点赞
收藏
评论区
推荐文章
编程范儿 编程范儿
4年前
Vue刷新页面有哪几种方式
在Vue项目中,刷新当前页除了window.reload(),你还能想到什么办法?而且这种办法会重新加载资源出现短暂的空白页面。体验不是很好。在某个详情页面的时候,我们经常需要通过路由中的详情id去获取内容,当我们在不同的详情页来回切换的时候,打开的页面是同一个,只是需要通过监听路由中的参数id的变化去重新请求详情接口。如果这个详情页只需要一个接口
CuterCorley CuterCorley
4年前
Python 爬取留言板留言(一):单进程版+selenium模拟
@toc一、项目概述1.项目说明本项目主要是对领导留言板内的所有留言的具体内容进行抓取,对留言详情、回复详情和评价详情进行提取保存,并用于之后的数据分析和进一步处理,可以对政府的决策和电子政务的实施提供依据。网站链接是,任意选择一条留言点击进入详情页后,如下对于图中标出的数据,均要进行爬取,以此构成一条留言的组成部分。2.环境配置(1)P
CuterCorley CuterCorley
4年前
Django+Vue开发生鲜电商平台之8.商品详情页功能实现
不走康庄大道,我自己喜欢做什么要比别人怎么看我更重要。——李彦宏Github和Gitee代码同步更新:;。一、viewsets实现商品详情页商品详情页效果如下:可以看到,左侧有商品轮播图,右侧是商品的详情信息,包括商品名称、商品描述、是否包邮、市场价、本店价、销量、库存量、购物车按钮、收藏按钮,还包括富文本详情和热卖商品等。apps/go
布局王 布局王
8个月前
鸿蒙Next仓颉语言开发实战教程:店铺详情页
各位早上好,幽蓝君又来分享仓颉开发教程了,今天的内容是店铺详情页:这个页面的内容看似简单,其实有很多小细节需要注意,主要还是让大家熟悉List容器的使用。整个页面由导航栏和List容器两大部分组成,导航栏我们已经分享过多次,今天不再赘述。主要说一下List
鸿蒙小林 鸿蒙小林
8个月前
《仿盒马》app开发技术分享-- 商品详情页(10)
技术栈Appgalleryconnect开发准备上一节我们实现了自定义标题栏和商品详情的数据接收,我们已经拿到了想要的数据,这一节我们要丰富商品详情页的内容。商品详情页面我们需要展示的是商品的各个属性参数、商品的图片、商品规格、活动详情等功能分析商品详情页
鸿蒙小林 鸿蒙小林
8个月前
《仿盒马》app开发技术分享-- 回收记录页(47)
技术栈Appgalleryconnect开发准备上一节我们实现了在订单列表中查看订单详情,但是我们的回收相关的营收就必须要进入到商品详情页才能够进行查看,如果我们在订单较多的情况下,一个一个的查看订单的详情就会变得非常的麻烦了,现在我们需要实现一个订单记录
鸿蒙小林 鸿蒙小林
8个月前
《仿盒马》app开发技术分享-- 商品兑换校验(70)
技术栈Appgalleryconnect开发准备上一节我们实现了可兑换商品的详情,我们能够查看到商品更多的信息,这一节我们来实现商品兑换相关的功能,在进行商品兑换之前,我们在兑换详情页面,点击立即兑换按钮之后我们需要跳转到兑换详情页,但是用户的积分可能达不
鸿蒙小林 鸿蒙小林
7个月前
《仿盒马》app开发技术分享-- 兑换商品订单详情页(80)
技术栈Appgalleryconnect开发准备我们的兑换商品列表相关的功能都已经实现的差不多了,现在我们还缺少一个订单详情查看的功能,为了ui一致性,我们的订单详情页样式要保持一致性,外观要跟订单、回收单的详情页相似。功能分析要实现订单详情首先我们需要拿
潮际好麦 潮际好麦
3天前
拼多多详情图制作还在手动排版?
潮际好麦商品套图,上传1张图自动生成整套详情页作为拼多多商家,你是否还在为详情页制作头疼?拍好的Beats耳机图(如手持质感图、悬浮科技图),要手动抠图、调尺寸、排模块,半天才能凑齐一套主图详情页?不仅耗时耗力,还容易出现风格割裂、卖点不突出的问题,直接
流浪剑客 流浪剑客
2年前
网络爬虫开发工具:Screaming Frog SEO Spider for Mac 最新中文版 支持M1 附注册码
是一款功能强大的SEO工具,可以帮助用户进行网站的SEO优化和分析。以下是ScreamingFrogSEOSpider的主要特点:网站爬取:可以快速扫描整个网站并列出所有内部和外部页面,包括URL,标题,描述和头信息等。数据导出:可以将扫描结果导出为CSV
布局王 布局王
8个月前
鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
又到了高考的日子,幽蓝君在这里祝各位考生朋友冷静答题,超常发挥。今天要分享的内容是仓颉语言商城应用的个人中心页面,先看效果图:下面介绍下这个页面的实现过程。我们可以先分析下整个页面的布局结构。可以看出它是纵向的布局,整个页面由导航栏、个人资料、vip横条和