首先,小编声明一下: JS是单线程工作的,不适合做大量的密集型工作。要求前端一次性处理上万条数据,或者几M的数据量,本身就是不合理的
需求虽然不合理,但客户强烈要求如此。吐槽归吐槽,还是要接下这个任务。历经千辛万苦,终于满足了甲方爸爸的要求。写下此篇,一起来分享一下。
json
- 后端将JSON压缩成字符串,可以大大减少体积
- 在不影响效果的情况下,进行数据过滤(如: 热力图坐标, 国家、城市边界点...)
echarts
1. heatmap
需求:将IOT的坐标点,绘制成热点图展示
初版:客户查询3个月的数据时,数据量就达到了5M+,导致页面直接卡死。责令我们一个周进行优化,gg
一版(后端优化):后端将json整理成字符串,并去除了无效的字段。
经测试后,数据直接从5M优化成3M。性能大大提升。
二版(后端优化):根据时间过滤坐标点(一个周 / 5, 一个月 / 20, 3个月 / 50, 一年 / 100,然后向下取整)然后将心跳的坐标点(我司是一个小时一次心跳)过滤,每隔5个点,取一次。即取第1个点,第6个点...
经测试后,数据直接从3M优化成200K左右。性能飞起
二版(前端优化):不要将chart实例放在data中。声明一个全局变量去接收echart即可
<script>
let chart = null
export default {
mounted () {
chart = echarts.init(this.$ref.chart)
}
beforeDestroy () {
if (chart) {
return
}
chart.dispose()
chart = null
}
}
</script>
经测试后,时间从5s下降到3.5s。性能显著提升
3天搞定甲方爸爸的需求,上线交付
...
2年过去了,客户想看1年的热力图~~~。页面展示直接10s+,客户要求再次优化
立项后,坐标点过滤的方法不在适合当前需求了。于是再次优化
三版(后端优化):开启job计算每天的坐标点总数,同时配合坐标点过滤。数据为:
{
"coord": [
120.14322240845,
30.236064370321
],
"elevation": 21
}
经测试后,时间从10s下降到2s。性能飞起
dom
dom是最耗费浏览器资源的,如果后台直接返回几W条数据,页面直接渲染会非常卡顿,甚至直接卡死。
优化dom卡顿问题的原理
根据浏览器的高度和宽度,通过滚动函数节流实现滚动后事件来动态渲染数据,减少对DOM节点的渲染。
1. table
使用umy-ui: www.umyui.com/umycomponen… 解决table表格的大数据问题
elementui的样式要写在umy的后面,才能覆盖umy的样式
import UmyUi from 'umy-ui'
import 'umy-ui/lib/theme-chalk/index.css'
import Element from 'element-ui'
Vue.use(UmyUi)
Vue.use(Element, {
size: Cookies.get('size') || 'mini', // set element-ui default size
i18n: (key, value) => i18n.t(key, value)
})
2. list
使用vue-virtual-scroller: www.npmjs.com/package/vue… 插件解决dom加载问题
<virtual-list
style="height: 500px; overflow-y: auto;" // make list scrollable
:data-key="'id'"
:data-sources="items"
:data-component="itemComponent"
/>
- 必须要设定高度
- 删除dom需要调用一下reset()方法
文件
文件上传
前端直接将文件扔给后端,由后端计算,生成数据
文件下载
前端调用后端接口,由后端计算数据,生成文件,然后下载
Woker
使用Web Worker
vue-worker插件集成了web worker: www.npmjs.com/package/vue… 的api。方便使用
小编没有使用过worker的场景,暂不过多介绍。有兴趣的码友可以自行多了解一下哈