vue.js - 内存泄漏 Laravel + Vue(router,vuex)
问题描述
大家好,我有一个问题。我正在处理一个大型 SPA 项目,并在切换路由器时发现内存泄漏。我已经完全排除了整个代码,只留下了测试代码。唉,这并没有帮助,即使使用带有切换路由的最简单的组件,垃圾收集器也无法正常工作。
每次切换时,都会创建 DOM 节点并且不再删除它们,这会导致在使用 SPA 应用程序时产生巨大的负载。我试图分析并找出内存中存储的内容。事实证明,Vue 组件并没有被销毁,而是保留在内存中。
该项目使用 Laravel-mix 组装
这是我使用的原始代码,但仍然存在内存泄漏:https ://jsfiddle.net/mgwbjc8v/2/
html:
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<ol>
<li>Open Browsers debug console.</li>
<li>Switch between foo and bar.</li>
<li>Repeat...</li>
</ol>
<p>
<router-link to="/user/foo">/user/foo</router-link>
<router-link to="/user/bar">/user/bar</router-link>
</p>
<router-view></router-view>
</div>
视图:
let foo = {
template: `<div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
<div>Bar</div>
</div>`,
mounted() {
}
};
let bar = {
template: `<div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
<div>Foo</div>
</div>`,
mounted() {
}
};
const router = new VueRouter({
routes: [
{ path: '/user/foo', component: foo },
{ path: '/user/bar', component: bar }
]
});
const app = new Vue({ router }).$mount('#app');
项目中的连接有点不同。如有需要,我可以提供,但意思是一样的
这是带有内存的快照
Webpack.mix.js
const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
应用程序.js
require('./bootstrap');
window.Vue = require('vue');
import router from './router';
import './language';
Vue.config.productionTip = false
const Vuex = require('vuex');
window.Centrifuge = require('./libs/centrifuge.min');
window.Noty = require('noty');
Noty.overrideDefaults({
layout : 'topRight',
theme : 'nest',
});
window.App = require('./app-object');
require('./app-legacy');
/** centrifuge 1.8.0 */
const cfuge = require('./centrifuge');
window.custom = {};
window.custom.scrollBar = require('./custom/scrollBar');
Vue.use(Vuex);
const store = new Vuex.Store(require('./storage.js'));
store.state.centrifuge = cfuge;
Vue.component('Foo', require('./components/Foo.vue'));
Vue.component('Bar', require('./components/Bar.vue'));
Vue.component('panel-loading', require('./components/other/PanelLoading.vue'));
const app = new Vue({
el: '#app',
store,
router
});
解决方案
推荐阅读
- python - 为什么 reindex_like(s, method='ffill') 不同于 reindex_like(s).fillna(method='ffill')
- csv - 在记事本++中的字符串之间插入逗号
- javascript - 防止在 keyup 上提交许多请求时自动完成
- html - 为什么我的横幅会创建水平滚动条?
- php - 我想在 PHP 中创建一个动态轮播引导横幅
- javascript - JavaScript 函数调用导致“setUTCHours 不是函数”
- mongoose - MongoError: E11000 重复键错误集合:用户索引:mobile_1 重复键:{ mobile: null }
- c# - 在 ASP.NET Core 中通过单击按钮更改属性值
- mysql - MySQL:将值拆分为多行,在 MySQL 8 上可以,但在 MySQL 5.7 上不起作用
- apache-kafka - Apache Kafka 在并行向代理发送多条消息时如何维护秩序?