后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案
创始人
2025-06-01 21:42:12
0

前言

性能优化,是前端绕过不去的一道门槛,甚是重要。最近一年,也很少有机会在项目中进行前端性能优化,一直在忙于业务开发。

最近终于是来了机会,遇到了这样的场景,心里也甚是激动,写个随笔记录下性能优化的过程及逻辑,有需要的可以参考下。

场景

后端接口一下子返回了 9000 多条数据,而且不带分页参数,全部返回了。

说实话,刚联调接口的时候我也有点懵,也是第一次遇到这样的情况,于是询问后端同学为什么要这样。他回复我说是因为特殊需要,后端调的是大数据的接口,拿的是大数据团队的数据,技术方案评审时,要求数据不落表(我也不太懂后端这是什么意思)

毫无疑问,将近一万条数据在前端渲染,百分之百的会造成卡顿。而且接口调用时间也会很长。

在这里插入图片描述

从上图我们可以看到,光下载 http 接口的响应数据就需要 3.14s(此时是8000条数据),而正常接口的下载时间一般是以毫秒为单位。所以需要优化。

解决思路

1. 首先是前端分页

首先,需要思考下这将近一万条数据如何在前端渲染的问题。肯定是不能一下子进行全部展示的。既然后端没有进行分页,那就前端来进行分页。

前端分页逻辑其实很简单:有分页的组件,拿来用就行。使用 数组的 slice 方法,对总数据进行分割,跳转到不同页时,根据 pageSize 和 limit 两个参数分割数组。

比较简单,就直接上代码了

// 前端分页逻辑
/*** 该方法用于前端分页* @param limit         每页条数* @param currentPage   当前页* @param tableData     总数据*/queryByPage(limit, currentPage, tableData) {return tableData.slice((currentPage - 1) * limit, currentPage * limit)}

进行前端分页后,只有第一次调用接口时会非常慢,之后进行跳转其他页码时,是不调用接口的,页面效果会很快。

不过这终究不是最终的解决方案,接口还是比较耗时,如果在进行其他操作后在调用该接口,仍然会非常慢,仍需继续优化。

2. 优化返回字段

从上图我们可以看到,造成接口时间长的主要原因是:ttfbcontent download 的时间太长了,正常情况下,这哥俩的耗时应该是以毫秒为单位的。

不过,和后端同学沟通,目前的 TTFB 时间已经是优化过后的,本来是 十几秒 的时间,现在优化到 3秒左右,他那边目前没有好的再优化 TTFB 时间的方案。

那下一步就是优化 content download 的时间。

content download :收到响应的第一个字节,到接收完最后一个字节的时间,就是下载时间。即 下载 HTTP 响应的时间(包含头部和响应体)

通过看接口返回详情,我们可以很清晰的了解到:这个接口响应的资源很大,大概有7M(估算的,因为优化字段后资源大小仍然有 4M 左右,当时忘了看之前的资源大小)

看到这里,我们就能意识到:原来是接口返回的数据资源太大,导致下载时间长。 那么,我们该如何优化数据资源呢?

网上出现的比较多的是这两种方案:

  • 1、移除重复脚本,精简和压缩代码,比如借助自动化构建工具 grunt、gulp 等。(不太熟悉,加上时间紧迫,就没了解)
  • 2、压缩响应内容,服务器端启动 gzip 压缩,可以减少下载时间。

当时我向后端同学推荐了第二种方案:后端使用 gzip 压缩,前端处理数据,但不知为何,后端同学没采用这种方法。

不过,后端精简了返回的字段,把无用的字段统统删除,将返回的数据资源大小控制在了 4M 左右。

3. 最终优化(前端分页 + 后端分页)

我和后端同学又讨论了几种方案,但细细想过后又都一一否决了,最终定下来方案如下:

前端将分页参数传给后端,后端根据前端传的分页参数,返回 pageSize * limit 条数据。前端将数据缓存起来,调用当前页之前的数据就不用调用接口了。而且第一次加载的时候,返回的数据较少,content download 下载时间就会大大降低。

说实话,我有些不太理解,既然后端都要分页了,那为什么不按照正常的分页逻辑来呢?点击第几页就返回第几页的数据。对此,后端同学给我的解释是:这些数据没有落表,而且要大量计算。我不是特别理解,但后端坚持不用正常的分页逻辑,我也无可奈何,只能按照这个思路写前端逻辑。

PS:如果不是特殊需求,后端不进行分页的话,建议直接打一顿

前端分页逻辑已经写好了,代码在上面,主要问题是如何判断点击当前页后,前面的页码点击不调用接口,以及修改每页条数后,如何判断哪个页面之前不需要调用接口。

思路:

定义一个变量 clickedMaxPage,默认值为 1,用于储存当前页的页码点击的最大值。

考虑 页码变化事件、每页条数变化事件 对于 clickedMaxPage 的变化

// 当前页发生变化
// page: 当前页码
currentPageChange(page) {// 如果 page > this.clickedMaxPage 调用接口,否则不需要if (page > this.clickedMaxPage) {this.clickedMaxPage = page// 调用接口return}// page <= this.clickedMaxPage// 调用前端分页方法
}// 每页条数发生变化
// size: 当前每页条数
sizeChangeHandle(size) {
/*** 需要判断当前总条数是否大于分页条数,* 如果大于,正常取余判断, 余数不为0,clickedMaxPage = 商 + 1,否则 clickedMaxPage = 商* 如果小于等于 clickedMaxPage = 1*/if (this.data.length > size) {// 获取余数const remainder = this.data.length % size// 获取商数const result = parseInt((this.data.length / size) + '')if (remainder === 0) {this.clickedMaxPage = result} else {this.clickedMaxPage = result + 1}} else {this.clickedMaxPage = 1}// 前端分页逻辑
}

总结

按照上面的方法,页面初始化的时候确实比之前快了很多,大概有一倍左右。不过直接跳转到最后一页,接口还是会有些缓慢。不过,对于上万条数据,也很少有人会直接跳转到最后一页进行搜索,毕竟上面也是有筛选条件可以进行筛选的。总而言之,也算是完成了性能优化。

前端性能方案有很多种,比如 SSR,只是目前暂时还未了解,以后慢慢掌握。

本篇文章介绍的方法只是其中比较特殊的一种,正常来说,我内心还是比较偏向于 gzip 压缩处理的。

如果上面有不对的地方,欢迎评论留言,感谢支持。

相关内容

热门资讯

提振消费,如何增强供需适配性 云南大理白族自治州,游客(左)与摄影师一起挑选照片。 北京朝阳区,一名智能柜补货员在卸货。 以上图...
贝仕达克:预计2025年度净利... 每经AI快讯,贝仕达克1月30日晚间发布业绩预告,预计2025年归属于上市公司股东的净利润860万元...
英媒:随着就业市场降温,美国大... 来源:格隆汇APP 格隆汇1月30日|据英国金融时报,本周,美国的一些大型企业公布了裁员计划,预计将...
终结5连败!德约3-2逆转辛纳... 北京时间1月30日,2026赛季网球大满贯澳大利亚公开赛继续进行,在男单下半区的半决赛中,塞尔维亚天...
去年辽宁非金融企业债务融资达6... 1月30日,人民银行辽宁省分行召开2026年一季度新闻发布会,介绍2025年度辽宁省金融运行主要情况...
“大V带货”遭监管重拳:基金销... 记者 洪小棠 1月29日,证监会证券基金机构监管司发布了新一期《机构监管情况通报》(下称《通报》),...
ST宁科完成组织架构重大调整 ... 来源:新浪财经-鹰眼工作室 【财经网讯】宁夏中科生物科技股份有限公司(证券代码:600165,股票简...
原创 i... 很多人看到苹果这份“史上最强”季度成绩单时,第一反应都是:这销量也太夸张了吧? 尤其是大中华区 ...
Cloudflare入驻B站和... IT之家 1 月 30 日消息,Cloudflare 宣布入驻B站和小红书,认证显示为“Cloudf...
首日涨超160% 智能制造装备... 上证报中国证券网讯(记者 张雪)1月30日,美德乐正式登陆北交所。截至当日收盘,公司股价报109.5...
特朗普提名下一任美联储主席 据新华社消息,美国总统特朗普30日提名美联储前理事凯文·沃什为下任美联储主席,这一提名还需获得参议院...
由盈转亏、业绩下滑超85%!2... 面对每天上千份上市公司公告该看哪些?重大事项公告动辄几十页几百页重点是啥?公告里一堆专业术语不知道算...
原创 华... 金价的上涨和美元的下跌已经让整个依赖美西方货币体系和金融体系获利的人感受到了巨大的威胁。 在美国财政...
康佳集团原董事长周彬、原副总裁... 老牌家电巨头康佳集团(000016)在经历控制权变更与管理层换血的震荡期后,迎来了更为剧烈的“余震”...
安诚财险2025年揽收保费52... (图片来源:视觉中国) 蓝鲸新闻1月30日讯(记者 陈晓娟)日前,安诚财产保险股份有限公司(下称“安...
国际金价、银价,暴跌! 据新华社1月30日消息,国际黄金和白银价格1月29日上演“过山车”行情,双双站上高位后又暴跌,市场剧...
A股115家半导体公司2025... 近期,A股半导体行业上市公司陆续披露半年度业绩预告。据集微网统计,截至2026年1月30日,在已披露...
一图读懂服务消费新政:涉及交通... 红星资本局1月30日消息,为优化和扩大服务供给,聚焦重点领域、潜力领域,加快培育服务消费新增长点,促...
沪农商行:着力于稳健运营、控制... 证券日报网1月30日讯 ,沪农商行在接受调研者提问时表示,投资交易策略方面,公司将基于对2026年宏...
实力“圈粉”全球客:去年上海离... 记者从市税务局获悉,2025年境外旅客在沪办理退税申请单数量同比增长3倍,退税商品销售额和退税额均增...