进来着急的前端佬,我直接抛出结论吧!

Element-plus的组件,经过测验,如下组件存在内存泄漏。如下:

  • el-carousel
  • el-select + el-options
  • el-descriptions
  • el-tag
  • el-dialog
  • el-notification
  • el-loading
  • el-result
  • el-message
  • el-button
  • el-tabs
  • el-menu
  • el-popper

验证环境为:

Vue Version: 3.5.13
Element Plus Version: 2.9.7
Browser / OS: window 10 / Edge 134.0.3124.85 (正式版本) (64 位)
Build Tool: Webpack

不排查ElementUI也存在这个问题。

好了。接下来细细聊。


前因

为什么检测到这种问题?主要因为一个项目引用了Element-plus。然后,你懂的,买的人永远都会想要最好的,然后买的人就这么一顿狂点Web页面,看见内存占用飙到老高。

于是...前端佬都懂的,来活了。


技术大厂→大厂→前后端测试捞人,待遇还不错~


排查

一开始我是不敢怀疑这种高star开源组件的。总以为自己是写的代码有问题。

详细代码就不贴了,主要用ElDialog组件,封装成一个命令式的Dialog组件,避免频繁的使用v-modal参数。

然后,就直接怀疑上这个组件了。

经过测试,果不其然,从关闭到销毁,会导致内存猛增,因为Dialog中有各种表单组件,一打开就创建了一大堆的Element元素。


精确定位,使用了FinalizationRegistry类追踪创建的Dialog实体,代码如下:

const finalizerRegistry = new FinalizationRegistry((heldValue) => {
  console.log('Finalizing instance: ',heldValue);
});


// 在创建处监听
const heldValue = Symbol(`DialogCommandComponent_${Date.now()}`);
finalizerRegistry.register(this, heldValue);
console.log(`Constructed instance:`,heldValue);

发现一直没有Constructed instance销毁的信息输出。

随后,使用了Edge浏览器中的分离元素来打快照,步骤如下图。


经过反复的操作,然后点击主动垃圾回收,然后发现el-dialog的元素都会增加,基本确认无疑了。

但还是怀疑,会不会是Dialog中,引用的问题,导致元素一直没能销毁?所以,使用了纯纯的el-dialog来校验,同样的操作,既然如故。


然后的然后,我使用了如下的代码,去校验其它组件是否存在同样的问题。代码如下:

 
  
  
xxx

如上代码,进入页面后,点击click,然后关闭所有的弹窗。然后再次点击reset按钮,然后再次点击click,关闭所有弹窗。如此可以多操作几次。

就发现了开头的组件,都存在内存泄漏问题。


未能解决

有问题,当然首先看看别人有没有出现过。各种搜索就不说了,大掘金也搜过,在Element-plus的github仓里的Issues中找过,发现的办法基本无用。

以下是自己思考的几条路子:

  1. 有泄漏的,都手搓一个?
  2. Eldialog全局只用一到两个?
  3. 将所有路由,都打成一个单页面(html)。
  4. 改源码....


结尾

还是在这里,求助大佬,看以上思路是否有错,然后跪求orz解决办法。

自己后续如果解决对应一些问题,会即时和大家分享。


——转载自:大怪v

开源硬件平台