有没有办法让Electron中的所有子窗口只有一个进程

问题描述 投票:0回答:1

我正在开发具有多个窗口的电子应用程序。假设我有一个主窗口和几个子窗口。

如果我创建 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)

具有 23 个 Electron 进程的任务管理器

我知道这就是 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>

具有 4 个 Electron 进程的任务管理器

如果我从主进程(第一个片段)创建所有子窗口,有没有办法让它们只有一个进程?如果有人能解释为什么它会这样工作,那就太好了。

附注我正在使用 Electron Fiddler 和 Electron 6.0.2 运行时来运行这些片段

javascript typescript electron
1个回答
1
投票

更新:亲和力正在被删除,请参阅https://github.com/electron/electron/pull/26874

affinity
选项可以解决问题。具有相同亲和力的窗口将聚集在一个进程中。

有关此功能的更多详细信息可以在此处找到

https://github.com/electron/electron/pull/11501

还有这里

https:// Electronjs.org/docs/api/browser-window#new-browserwindowoptions

© www.soinside.com 2019 - 2024. All rights reserved.