Vue.js使用ECharts内存泄漏问题
前段见时间有个项目,自己想尽可能查看现场各设备的运行参数,显示一些统计信息,之前同事用C#写了个画面的,但感觉不灵活,换个项目,要改的东西就很多,界面基本需要重画。后来想起之前用ECharts做过电子在屏的,应该展示效果会更好。之前考虑用React做前端的,后来想想就一个页面,直接用Vue干吧,正好Vue也升级到3了,然后用Electron做个包装,也不用再下浏览器。记录下碰到的问题吧。
ElementUI按需引入
之前Vue用的脚手架是vue-cli
,统计时间是比较长的,升级到3之后,改用vite
了,很方便。因为使用的组件不多,把ElementUI全部引入的话,JS文件会比较大,所以只引入使用的几个组件。参照官方文档。
1 | import 'element-plus/lib/theme-chalk/index.css' |
ECharts
按需引入
ECharts升级到5之后,与之前的引入有一点区别,具体可参考官方文档
1 | import * as echarts from 'echarts/core' |
VUE中引入ECharts
最开始在VUE中引入ECharts老是报错,后来查了下,应该是DOM没有准备好,具体参考的应该是vue-element-admin里面的配置来着。应该用nextTick()
,待DOM准备好之后,ECharts绑定到DOM。
1 | data() { |
内存泄漏
参照ECharts的样例做好了一个动态更新的图表,每秒从后台拉下数据进行更新,还蛮好看的。可是过两天后发现浏览器或者Electron内存暴了,直接把系统快干死。当时不清楚哪里的问题,以为是每秒获取数据后处理有问题,检查了好久都没办法解决,最后只好排除法,页面上的东西一个个排除观察一段时间看内存是不是一直往上涨,最后定位到ECharts。上网查了下,发现有提到的echarts.clear()
或echarts.dispose()
,感觉这个有点不靠谱,这样子那不是每次echarts都需要重新生成?反正也试了,确实效果不好,图表都是重新生成,不能连续变化。
没办法,查文档吧,最后还真发现了些什么。里面有个组件合并模式
,就是每次数据变化后都会调用一次this.echarts.setOption()
,因为设置不当,数据一直往图表里面填,没有释放旧数据。其实解决办法很简单,就是把有变动的地方设置好ID,每次更新就更新带ID的数据。
1 | this.chart.setOption( |