1 / 11
文档名称:

前端常见内存泄漏及解决方案 (2).docx

格式:docx   大小:118KB   页数:11页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

前端常见内存泄漏及解决方案 (2).docx

上传人:科技星球 2022/3/11 文件大小:118 KB

下载得到文件列表

前端常见内存泄漏及解决方案 (2).docx

文档介绍

文档介绍:【Web技术】849-前端常见内存泄漏及解决方案
 
   
 
 
 
 
 
 
 
     
 
 
 
 
 
作者:lzg9527 dom。
removeEventListener 移除事件监听
vue 中容易出现内存泄露的几种情况
在 Vue SPA 开发应用,那么就更要当心内存泄漏的问题。因为在 SPA 的设计中,用户使用它时是不需要刷新浏览器的,所以 JavaScript 应用需要自行清理组件来确保垃圾回收以预期的方式生效。因此开发过程中,你需要时刻警惕内存泄漏的问题。
全局变量造成的内存泄露
声明的全局变量在切换页面的时候没有清空
<template>
<div id="home">这里是首页</div>
</template>
<script>
export default {
mounted() {
= {
// 此处在全局window对象中引用了本页面的dom对象
name: 'home',
node: ('home'),
}
},
}
</script>
解决方案:在页面卸载的时候顺便处理掉该引用。
destroyed () {
= null // 页面卸载的时候解除引用
}
监听在 window/body 等事件没有解绑
特别注意 之类的时间监听
<template>
<div id="home">这里是首页</div>
</template>
<script>
export default {
mounted () {
('resize', ) // window对象引用了home页面的方法
}
}
</script>
解决方法:在页面销毁的时候,顺便解除引用,释放内存
mounted () {
('resize', )
},
beforeDestroy () {
('resize', )
}
绑在 EventBus 的事件没有解绑
举个例子
<template>
<div id="home">这里是首页</div>
</template>
<script>
export default {
mounted () {
this.$EventBus.$on('homeTask', res => (res))
}
}
</script>
解决方法:在页面卸载的时候也可以考虑解除引用
mounted () {
this.$EventBus.$on('homeTask', res => (res))
},
destroyed () {
this.$EventBus.$off()
}
Echarts
每一个图例在没有数据的时候它会创建一个定时器去渲染气泡,页面切换后,echarts 图例是销毁了,但是这个 echarts 的实例还在内存当中,同时它的气泡渲染定时器还在运行。这就导致 Echarts 占用 CPU 高,导致浏览器卡顿,当数据量比较大时甚至浏览器崩溃。
解决方法:加一个 beforeDestroy()方法释放该页面的 chart 资源,我也试过使用 dispose()方法,但是 dispose 销毁这个图例,图例是不存在了,但图例的 resize()方法会启动,则会报没有 resize 这个方法,而 clear()方法则是清空图例数据,不影响图例的 resize,而且能够释放内存,切换的时候就很顺畅了。
beforeDestroy () {
()
}
v-if 指令产生的内存泄露
v-if 绑定到 false 的值,但是实际上 dom 元素在隐藏的时候没有被真实的释放掉。
比如下面的示例中,我们加载了一个带有非常多选项的选择框,然后我们用到了一个显示/隐藏按钮,通过一个 v-if 指令从虚拟 DOM 中添加或移除它。这个示例的问题在于这个 v-if 指令会从 DOM 中移除父级元素,但是我们并没有清除由 C