【发布时间】:2019-12-22 23:35:23
【问题描述】:
我正在开发具有多个窗口的电子应用程序。假设我有一个主窗口和几个子窗口。
如果我从主进程打开 google.com 创建 20 个子窗口,它会生成大约 23 个 Electron 进程(每个窗口一个 + GPU 进程 + 其他),并且在我的 Windows 10 机器上消耗大约 800 MB 的内存.这显然很多。
const {app, BrowserWindow} = require('electron')
let mainWindow
const webPreferences = {
sandbox: true
};
function createWindow () {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences
})
mainWindow.loadFile('index.html')
for (var t = 0; t < 20; t++) {
const childWindow = new BrowserWindow({
webPreferences
})
childWindow.loadURL('https://google.com')
}
}
app.on('ready', createWindow)
Task Manager with 23 Electron processes
我知道这就是 Chromium 的工作方式 - 每个选项卡都是一个单独的进程,所以如果一个选项卡坏了,整个浏览器和其他选项卡都是活动的。我对此毫不怀疑,但我注意到一件有趣的事情。如果我按照here 的描述使用本机window.open,它神秘地只产生4个进程。不知何故,它将所有“窗口”进程组合成一个单一的 + GPU + 其他东西,总共消耗 400 MB,这是更好的结果。
const {app, BrowserWindow} = require('electron')
let mainWindow
const webPreferences = {
sandbox: true // without sandboxing it spawns 23 processes again :(
};
function createWindow () {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences
})
mainWindow.loadFile('index.html')
mainWindow.webContents.on('new-window', (event, url, frameName, disposition, options) => {
event.preventDefault()
const win = new BrowserWindow({
...options,
show: false,
webPreferences
})
win.once('ready-to-show', () => win.show())
if (!options.webContents) {
win.loadURL(url) // existing webContents will be navigated automatically
}
event.newGuest = win
})
}
app.on('ready', createWindow)
还有 index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<script>
for (var t = 0; t < 20; t++) {
window.open('https://google.com');
}
</script>
</body>
</html>
Task Manager with 4 Electron processes
如果我从主进程(第一个 sn-p)创建所有子窗口,有没有办法让所有子窗口只有一个进程?如果有人能解释为什么它会这样工作,那就太好了。
附:我正在使用带有 Electron 6.0.2 运行时的电子提琴手来运行这些 sn-ps
【问题讨论】:
-
出于同样的原因,Chrome 会为每个选项卡生成一个新进程; Electron 只是 Chromium 渲染引擎的一个包装器。您在这里遇到的问题是一些人对 Electron 等平台持批评态度的主要原因 - 通过 Web 渲染引擎运行“本机”应用程序的巨大开销。
-
请仔细阅读问题。我知道这是一个包装。问题是为什么如果我在主进程中创建一个窗口,它会产生很多进程,但同时它在浏览器进程中的每个窗口中只产生一个进程。
标签: javascript typescript electron