项目里用了mock等手段做的前端假画面,要发布到客户的服务器上看效果,现在后台还没开发,用的都是假数据。mock里用了一些node builtin模块的功能(fs之类的),build出来,进画面就Ty
顺晟科技
2022-09-03 12:21:59
142
项目里用了mock等手段做的前端假画面,要发布到客户的服务器上看效果,现在后台还没开发,用的都是假数据。mock里用了一些node builtin模块的功能(fs之类的),build出来,进画面就TypeError
顺晟科技:
求助各位路过的大神给支个招
解决方案就是,要让每一次data()返回值中的数据都是不同的对象,而不是对不可回收对象的引用就可以了
PS:个人不太建议用data.js,使用这种方式构造data()数据很消耗性能
应该怎么做?直接build把mock都打进去了,总不能在客户服务器上,用vue-cli-service serve启动吧?一会儿就把PC内存吃光了
第一个问题是,source中使用了fs模块,导致build出来的代码不能运行第二个问题是,项目中存在很严重的内存泄漏,导致运行卡顿和内存飙升
第二个关于内存泄漏的问题,最终也找到了罪魁祸首。
emmm,目前就这些,其余的基本都能在网上查到(比如闭包、全局变量、事件监听、定时器、控制台打印之类的内存泄漏)
由于是假画面,所以将画面中的数据写入了单独的data.js文件,在view画面中,import了这些data文件,并将data文件中的数组与object直接绑定到了vue的data()返回值中,导致画面根据这些不会被回收的数据渲染了dom
而由于框架在移除这些dom时,并没有一并将dom与数据的MVVM关系移除,导致detached dom element越来越多,最终引发了memory leak
第一个问题的解决方案很简单,就是在build范围内,不要用fs模块,不光fs模块,其他的node内建模块最好也不要用
除此之外,就是使用第三方控件的时候,一定要注意调用人家提供的dispose、destroy之类的方法,避免内存泄漏再有就是,使用vue-router时,通过beforeEach添加的钩子,会返回对这个钩子解除绑定的函数,一定要把它声明出来,并且在钩子函数执行的时候调一下
比如在mock里直接return一些字面量构造的数据结构,或者使用data.js文件的话,对要引用对象做JSON.parse(JSON.stringify(x))处理
首先,这是遇到了两个问题。