百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

被偷家了!崩溃!!Element-plus组件测试的后续~

myzbx 2025-09-09 07:28 2 浏览

最新消息,VUE 的 slot 移除产生内存泄漏问题已修复!!!前端佬们嗨起来~

---------------------分割线
-------------------------------

这个是之前一个文章的后续,没有看过的前端佬可以点 这里 看看~

致歉

首先,向前端佬们说声,对不起!

怪自己学艺不精,没有仔细斟酌,上一篇文章里有一些错误,必须在这里指出来!

造成错误的原因有两个,Devtools 问题和 VUE 的 slots 的问题,没有看过之前的前端佬也没有关系,因为这个关乎很多前端佬的测试。以下为详情。

Devtools工具的BUG

#技术分享Devtools 的问题,是通过 Chromium issues 中知道的。有条件的前端佬可以戳 这里 。没有条件的,我这里借花献佛说明下。比如下面这个例子:

<!DOCTYPE html>

<html>

<head>

<title>方块从左到右动画</title>

<style>

.square { width: 50px; height: 50px; background-color: red; position: absolute; top: 50px; left: 0; animation: moveRight 2s linear infinite; } @keyframes moveRight { from { transform: translateX(0); }

to { transform: translateX(200px); } } .animation-paused { animation-play-state: paused; } </style>

</head>

<body>

<div id="animatedSquare" class="square"></div>

<button id="removeButton">移除方块</button>

<script>

let square = document.getElementById('animatedSquare'); const removeButton = document.getElementById('removeButton'); const handleRemove = () => { if (square) { square.classList.add('animation-paused'); requestAnimationFrame(() => { square.remove(); square = undefined; console.log("方块已移除"); }); } }; removeButton.addEventListener('click', handleRemove); </script>

</body>

</html>

当你一直打开 Devtools 工具时(即按开 F12),然后点击移除元素。然后测试一下,发现仍然存在分离元素,如下图:

明明已经移除所有事件、排除了全局变量的原因,还是有内存泄漏的问题。我这边经过 chrome134、chrome135验证两个版本的验证,都存在。

没别的了,就是 Devtools 的问题。按照 Chromium 项目人员解释的原因,如下图:

翻译中心思想就是,Animations (动画) 面板中保留了对动画元素的引用。

所以要测试带有动画元素的组件,需要在操作完毕之后,再打开 Devtools 面板。

Vue的slot的BUG

还是先上链接,有条件的可以看 vue 的 commit。点 这里

没条件,我这边可以举例子来解释下。

假如有这么一个父组件:

<template>

<div>

<slot></slot>

</div>

</template>

然后我引用这个组件。

<template>

<ParentJBK v-if="!model">111</ParentJBK>

<button @click="fn1">Hidden</button>

</template>

<script>

import { ref } from 'vue' imprt ParentJBK from './parentJBK.vue'

export default { components:{ ParentJBK }, setup(){ const model = ref(false) function fn1(){ model.value = true; } return { model, fn1 } } }

</script>

按照上面的,如果在父组件下,填充了元素。那么,这个时候去销毁掉父组件元素,就会在分离元素下出现销毁的 div 元素。有意愿的可以动手试试。

看上面的那个 commit,大概思路就是在父组件销毁后,顺道把 slot 销毁掉。

再次崩溃

经过这么一轮,我觉的,给来个痛快的吧。

以上的发现,都是在提了 Element-plut 的 issues 后,经过 Element-plus 贡献者提出的。然后涉及的背后问题,我事先是想都想不到的。谁敢想 Devtools 都有问题,原来可是我朝圣的对象啊~。。。

调整后的结论

经过上述问题,我重新调整了测试方法,然后根据 目前我所知的来测试 ,在 Element-plus 组件中,还会存在泄漏的组件如下:

  • el-select
  • el-popper
  • el-carousel
  • el-tabs
  • el-button
  • el-menu
  • el-dropdown
  • el-result
  • el-descriptions

最后说下

对于内存泄漏问题,这里有必要再和大家颗粒度对齐下~

内存泄漏是指程序在申请使用内存后,无法在程序关闭后正常释放应该释放的内存,导致此内存一直被占据。

用上面这个例子解释就是,当我们使用 JS 去销毁 DOM 元素后,但因为某些 JS 变量或者事件或者哪个回调函数中还存在引用这段 DOM 元素,导致 DOM 树上的元素是被移除了,而内存却还保留了 DOM 元素数据。结果就是随着操作一直增加,占用内存得不到释放,该程序使用的内存就会一直增加。

之前评论中,有些前端大佬说,使用 Element-plus 组件,总是卡。我们倒可以先分析分析,看看是不是在渲染的时候,出现了跳帧的情况。即元素节点渲染过多或者 JS 某个程序运算过多,造成在16ms 左右不能渲染完整。

跳帧情况会很多,大家在 juejin 中看看其他大佬的文章,有很多说明。

才疏学浅,随时接受大佬的赐教~

评论也可以贴出自己的问题,大家共同进步 respect!

相关推荐

前端工程师养成计划 专区_前端工程师技能要求

前端工程师必修课本课程从最基本的概念开始讲起,步步深入,带领大家学习HTML、CSS样式基础知识,了解各种常用标签的意义以及基本用法,后半部分讲解CSS样式代码添加,为后面的案例课程打下基础。本课程让...

深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别

因为Diff算法,计算的就是虚拟DOM的差异,所以先铺垫一点点虚拟DOM,了解一下其结构,再来一层层揭开Diff算法的面纱,深入浅出,助你彻底弄懂Diff算法原理认识虚拟DOM虚拟...

css 布局简述_css布局的几种方式

本篇简单介绍了css布局体系。包括Flowlayout、display、floats、positionFlowlayout(NormalFlow)CSSFormattingContext...

dart系列之:HTML的专属领域,除了javascript之外,dart也可以

简介虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的。除了andorid和ios之外,web就是最常见和通用的平台了,dart也提供了对HTML...

原来隐藏一个DOM元素可以有这么多种方式,最后一种你肯定不知道

我们在日常编码的时候,隐藏一个dom元素有很多种方式,今天我们来盘点一下隐藏dom元素有哪些方式,最后一种,你绝对没有用过。display:none作为经常用来隐藏元素的css属性,di...

JavaScript精通到深入_javascript进阶书籍推荐

前几天教大家从入门到精通,当然仅靠那一篇文章是不足以带领大家精通JavaScript的,今天给大家带来第二讲!BOM和DOM简介BOM,BrowserObjectModel,浏览器对象模型。BO...

巧克力:从一朵花开始的华丽变身_巧克力花束教程视频

世界上几乎所有的巧克力产品,都出自四五家大公司大型工厂里的流水线。然而,“手工制作巧克力”正在成为一种潮流,吸引着越来越多的人沉醉其中。这些娇嫩的花朵,是你吃过的每一块巧克力的开始。可可花直接生长在...

browser-use:AI 驱动的浏览器自动化神器——DOM识别与交互详解

browser-use可以识别网页中可交互DOM内容,并能与之进行交互。本文将详细介绍browser-use实现这一核心功能的技术细节。一、可交互元素识别browser-use是通过DOMS...

HTML DOM Progress 对象_html中的对象

Progress对象Progress对象是HTML5新增的。Progress对象表示一个HTML<progress>元素。<progress>元素表示任务...

HTML DOM Script 对象_html document对象

Script对象Script对象表示一个HTML<script>元素。访问Script对象您可以使用getElementById()来访问<scrip...

虚拟DOM真的比操作原生DOM快吗?前端大神提供4个参考观点!收藏

尤雨溪:https://www.zhihu.com/question/31809713/answer/53544875VirtualDOM真的比操作原生DOM快吗?1.原生DOM操作v...

前沿|一种新的植入药物或可将HIV的预防时间持续一年

国外已经批准了一种叫做Truvada(中文名:特鲁瓦达)的药物用于HIV感染的暴露前预防。但是由于该药需要每天服用,因此有些人可能无法坚持,从而使得该药的预防效果降低。最近一项新的研究或许可以改变这种...

轻量级埋点sdk搭建,便捷更全面_埋点工具

引言借助埋点监控sdk,我们可以统计用户的点击,页面pv、uv,脚本错误、dom上报等关键信息等。一:项目初始化1.技术栈Tsrollup打包工具2.搭建项目npminit-ytsc--in...

China&#39;s Humanoid Robotics Race Heats Up as Tesla&#39;s Optimus Hits a Wall

TMTPOST--Tesla'sonce-hypedhumanoidrobotproject,Optimus,hashitasnag.Partsprocurementhas...

单机训练速度提升640倍!独家解读快手商业广告模型GPU训练平台Persia

【导读】:近期,快手宣布将在2020年春节前实现3亿DAU,快手商业化营收步伐也随之加速。快手从2018年“商业化元年”开始推行个性化的广告推荐。截止5月底,快手DAU已经突破2亿。随着用户和使用时长...