我正在开发具有多个窗口的电子应用程序。假设我有一个主窗口和几个子窗口。
如果我创建 20 个从主进程打开 google.com 的子窗口,它会生成大约 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)
我知道这就是 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>
如果我从主进程(第一个片段)创建所有子窗口,有没有办法让它们只有一个进程?如果有人能解释为什么它会这样工作,那就太好了。
附注我正在使用 Electron Fiddler 和 Electron 6.0.2 运行时来运行这些片段
更新:亲和力正在被删除,请参阅https://github.com/electron/electron/pull/26874。
affinity
选项可以解决问题。具有相同亲和力的窗口将聚集在一个进程中。
有关此功能的更多详细信息可以在此处找到
https://github.com/electron/electron/pull/11501
还有这里
https:// Electronjs.org/docs/api/browser-window#new-browserwindowoptions