位置: IT常识 - 正文

后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案(后端怎么返回数据给前端)

编辑:rootadmin
后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案 前言

推荐整理分享后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案(后端怎么返回数据给前端),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:后端返回数据,后端返回数据给前端,后端返回数据给前端,后端返回数据,后端接口返回的为文件,前端如何下载,后端返回数据格式有哪些,后端返回数据格式有哪些,后端返回数据给前端,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

场景

后端接口一下子返回了 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. 优化返回字段

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

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

后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案(后端怎么返回数据给前端)

那下一步就是优化 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 压缩处理的。

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

本文链接地址:https://www.jiuchutong.com/zhishi/295310.html 转载请保留说明!

上一篇:CSDN独家原创《芒果YOLO改进高阶指南》适用YOLOv5、YOLOv7、YOLOv8等改进专栏,来自人工智能专家老师联袂推荐(csdn创作激励)

下一篇:Nginx超时配置(nginx连接超时时间设置多少)

  • 华为荣耀8手机通话音量小怎么办(华为荣耀8手机,耳机好的但是插了还是外放)

    华为荣耀8手机通话音量小怎么办(华为荣耀8手机,耳机好的但是插了还是外放)

  • 华为p40为什么分屏不了(华为p40为什么分辨率高感觉很模糊)

    华为p40为什么分屏不了(华为p40为什么分辨率高感觉很模糊)

  • 苹果手机分辨率要设置多少比较清晰(苹果手机分辨率和安卓手机分辨率)

    苹果手机分辨率要设置多少比较清晰(苹果手机分辨率和安卓手机分辨率)

  • 芒果视频弹幕在哪里设置(芒果视频弹幕在哪里关闭)

    芒果视频弹幕在哪里设置(芒果视频弹幕在哪里关闭)

  • OTG连接是什么

    OTG连接是什么

  • 苹果手机蓝牙已经连接了为什么没有音乐(苹果手机蓝牙已打开为什么用不了)

    苹果手机蓝牙已经连接了为什么没有音乐(苹果手机蓝牙已打开为什么用不了)

  • 朋友圈该照片可见的朋友是什么意思(朋友圈该照片可见的朋友怎么增加)

    朋友圈该照片可见的朋友是什么意思(朋友圈该照片可见的朋友怎么增加)

  • 红米k30有息屏显示吗

    红米k30有息屏显示吗

  • 网桥的主要作用是(网桥主要作用于什么层)

    网桥的主要作用是(网桥主要作用于什么层)

  • aicc和cs6有什么区别(illustrator cc和cs6有什么区别)

    aicc和cs6有什么区别(illustrator cc和cs6有什么区别)

  • ipad2018是否支持otg(ipad2018是否支持pencil)

    ipad2018是否支持otg(ipad2018是否支持pencil)

  • ipad2可以用什么办公软件(ipad2可以用什么版本QQ)

    ipad2可以用什么办公软件(ipad2可以用什么版本QQ)

  • ipad2018出厂有膜吗(ipad2020出厂带不带膜)

    ipad2018出厂有膜吗(ipad2020出厂带不带膜)

  • 苹果个人开发者账号有什么用(苹果个人开发者账号多少钱)

    苹果个人开发者账号有什么用(苹果个人开发者账号多少钱)

  • vivoy93新手机充电几小时(vivoy93手机充电怎么那么慢)

    vivoy93新手机充电几小时(vivoy93手机充电怎么那么慢)

  • 手机淘宝怎么没有家乡版了(手机淘宝怎么没有必备工具)

    手机淘宝怎么没有家乡版了(手机淘宝怎么没有必备工具)

  • 美团骑手超时怎么处理(美团骑手超时怎么赔付)

    美团骑手超时怎么处理(美团骑手超时怎么赔付)

  • 荣耀20后盖是什么材质(荣耀20后盖是玻璃还是塑料)

    荣耀20后盖是什么材质(荣耀20后盖是玻璃还是塑料)

  • oppor15跟r15x的区别(oppor15x跟r15哪个好)

    oppor15跟r15x的区别(oppor15x跟r15哪个好)

  • 闲鱼怎么拉进黑名单(闲鱼怎么拉入黑名单)

    闲鱼怎么拉进黑名单(闲鱼怎么拉入黑名单)

  • 在WIN8中,该如何清理C盘垃圾文件?(win8.1怎么用)

    在WIN8中,该如何清理C盘垃圾文件?(win8.1怎么用)

  • 帝国cms手机模板怎么用(帝国cms手机模板是什么)

    帝国cms手机模板怎么用(帝国cms手机模板是什么)

  • python中如何基于numpy创建矩阵(基于python语言)

    python中如何基于numpy创建矩阵(基于python语言)

  • 年度减免税限额
  • 本年利润和利润分配未分配利润的区别
  • 企业内部研发支出会计处理探讨
  • 邮票可以抵个税吗
  • 税款滞纳金计入成本费用还是营业外
  • 为职工支付的补充养老保险计入哪
  • 无法确定购买日期
  • 收到上级主管部门拨入的经费
  • 个体工商年报怎么弄
  • 抵扣红冲发票怎么报税
  • 逾期认证未抵扣的文件
  • 收到免税发票怎么做账务处理
  • 本月无销项只有进项申报表如何填写
  • 在建工程如何抵扣个税
  • 公司去大厅交社保要带什么证件
  • 已出账但未认证的抵扣联怎么办?
  • 企业所得税汇算交所得税如何做账务处理
  • 营业额包括增值税吗
  • 给行政事业单位扣缴义务人的一封信
  • 实际销售金额是含税还是不含税
  • 母公司对子公司的控股比例
  • 制作广告费用
  • 应交税费年末账务处理
  • 怎么写会计凭证
  • 发放股票股利的会计分录怎么写
  • 重置edge浏览器设置
  • 公司多缴税款超过3年怎么办
  • 补缴免抵退
  • linux驱动和windows驱动
  • 房地产企业项目开发法律风险
  • electronx
  • javascript零基础入门书籍
  • 如何在windows server2016中禁用域用户账户
  • 现金折扣账务处理
  • python tkinter详解
  • 甲供材料总额法和差额法
  • 累计折旧怎么折
  • 经费支出的定义
  • 企业资产的范围
  • php验证码代码怎么写
  • 增值税调整怎么结算
  • 增值税专票怎么交税
  • sql查询树状数据
  • 中标服务费需要签合同吗
  • 购买商品并入库做什么会计分录
  • 企业支付的费用化的一般借款利息支出属于什么
  • 营业税改征增值税跨境应税行为增值税免税管理办法
  • 残保金申报常见问题
  • 白酒系列代理
  • 外贸公司是不是什么都做的?
  • 商品盘点短缺
  • 固定资产可资本化的后续支出
  • 票据贴现怎么入账
  • 审计 调整分录
  • 万达对赌协议是什么
  • 单位购牙膏牙刷卫生纸怎么做账?
  • 企业构建固定资产无形资产和其他长期资产支付
  • 存货跌价准备冲减成本
  • 怎么操作win10系统
  • win10开始按钮点不动
  • winxp系统连接网络
  • windows取消隐藏文件夹
  • postgres.exe是什么进程 postgres进程查询
  • 自动切换桌面
  • shell脚本中如何交互传参
  • unity2.5d游戏地图处理
  • shell 单引号中引用变量
  • for 命令
  • 友盟的功能
  • jquery鼠标点击
  • 用jquery
  • js super方法
  • 第三届一带一国际高峰论坛
  • 税务局着装规定文件
  • 河北省2021城乡居民医保优惠新政策
  • 南阳市税务稽查局举报电话
  • 湖北税务网上登录
  • 昆山市税务分局领导名单
  • 网上报个人所得税
  • 河北个体户个人缴税标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设