-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
组件库内置Icon的错误用法会导致页面detached,从而造成内存无法被回收 #6299
Comments
你是在开发环境吧,开发环境无法 GC 是因为 Vue 在开发环境会在 Dom 上定义 2 个属性,一个 vnode,一个 vueParentComponent,这 2 个属性是给 Vue Devtools 使用的,你可以使用生产环境的试试 |
生产环境一样有这个问题,hoistStatic我也设置成false了。这个并不是DOM上是否有vnode,而是vnode上的el引用了DOM。而这个icon这种写法会被编译成一个全局的vnode。 |
看来 #6200 这个就是由于 checkbox 的 icon 导致的内存无法回收? |
@Zheng-Changfu 这种Icon写法问题在naive-ui这个库的好几个组件中都存在,checkbox只是其中之一。其中用到replacable方法的那几个icon都会有这个问题,不过这种可以通过在n-config-provider上设置icons属性,用自定义的icon替换内置icon的方式避免内置icon引起的内存问题。 |
在你还没有回复之前,我发现了这个问题,我在这个 pr 里面对这些问题进行了修复:#6319 |
其实现在还有一个很大的问题,就是 |
Describe the bug
很多组件的内置Icon(比如checkbox的CheckMark)使用方式不当,导致dom元素在卸载之后仍然被引用,造成内存无法被回收。
比如上面这个就是CheckMark,这种写法,会导致checkmark是一个全局的vnode,这个vnode是永久存在的,因此它绑定的el也不会被回收,因此会成为一个detachedElement。甚至会造成使用checkbox的大组件整个都detached。
Steps to reproduce
edge浏览器devtools有个比较好用工具-分离的元素detached element:https://learn.microsoft.com/en-us/microsoft-edge/devtools-guide-chromium/memory-problems/dom-leaks
1.打开devtools的「分离的元素」工具
2.点击toggle按钮,显示checkbox及其他元素
3.再次点击toggle,卸载checkbox及其他元素
4.在「分离的元素」工具中查看现有的detached element可以看到无法被GC的元素
Link to minimal reproduction
https://github.com/tracy2zhang/naive-demo
System Info
Used Package Manager
yarn
Validations
The text was updated successfully, but these errors were encountered: