<iframe>
的src
属性的动态变化。在测试中,我每秒更改一次src。几分钟后,我的可用内存使用率达到了88%,最终计算机崩溃了。我在一个Windows 10机器上进行了此测试,该机器有32 GB内存和Firefox浏览器。然而,在Raspberry Pi 4(4GB)上使用chromium-browser时,我首先注意到了内存问题。我不断地切换多个vue组件(如幻灯片)。其中一些也有
iframes
。就像上面的测试一样,内存泄漏了(虽然不是很快但在几天内),chromium-browser标签崩溃并显示“他死了吉姆”的笑脸。以下是测试代码:
<template>
<div id="app">
<iframe :src="src" />
{{ count }}
{{ src }}
</div>
</template>
<script>
export default {
data() {
return {
src : "",
source : [
"https://example.com/embeddedcontent/1",
"https://example.com/embeddedcontent/2",
"https://example.com/embeddedcontent/3",
"https://example.com/embeddedcontent/4"
],
count : 0,
interval : null
}
},
mounted() {
const interval = setInterval(() => {
this.src = this.source[ this.count % this.source.length ];
this.count = this.count + 1
}, 2000);
this.interval = interval;
},
beforeDestroy() {
clearInterval(this.interval);
}
}
</script>
事实
- 在不同的系统和浏览器上(
Win10/Firefox
,Raspbian/chromium-browser
)注意到相同的内存泄漏。 - 在Vue的开发(HMR)和生产版本中注意到相同的内存泄漏。虽然是独立的Vue应用程序。
iframe
的内容对我来说是未知的,因为src
属性可以设置为任何URL。
有什么方法可以防止这种情况发生吗?
目前,我只考虑过每隔几分钟刷新浏览器选项卡。这种方法有点不太正式,因为它没有解决问题的根源。当我想在我的Vue应用程序中显示另一个网站的内容时,除了使用iframes
之外,是否有其他替代方法?是否有一种方法可以清理整个iframe
而不会留下任何东西?
更新2021/02/25
我现在也尝试了Edge浏览器,结果相同(随时间增长内存不断增加)。我还尝试了Firefox的私人模式,影响很小(内存增长但速度较慢)。比较了Vue示例的生产和开发版本,没有区别。我还尝试了一个纯电子应用程序,其中包含以下代码(没有Vue):
let interval = null;
let sources = [
"https://hurtigruten.panomax.com/ms-roald-amundsen",
"https://hurtigruten.panomax.com/ms-fridtjof-nansen",
"https://rosenalp.panomax.com/",
"https://alpbach.panomax.com/galtenberg",
];
let index = 0;
let count = 0;
function startTheInterval() {
interval = setInterval(() => {
index = count % sources.length;
count = count + 1;
document.getElementById('monitor').src = sources[index];
},2000);
}
function clearTheInterval() {
clearInterval(interval);
}
startTheInterval();
相同的结果,内存增加快速。
iframe
时遇到了内存泄漏问题。我将检查这两个系统是否涉及任何扩展程序,以确保安全。你所说的serve-handler
是什么意思? - Pascal Lamersvue.config.js
中使用了publicPath: ""
选项。使用这个选项,我能够直接在浏览器中打开 Vue 生产构建版本,而不需要通过 HTTP 服务。也许还有一些值得检查的差异。 - Pascal Lamersfile:
是否会有所不同... - Michal Levý