在Electron应用程序中使用app.quit()关闭所有打开的窗口是不好的做法吗?

3

我有一个带有NodeJS和Express的Electron应用程序。主进程代码在一个文件(app.js)中,路由在另一个文件(router.js)中。

主文件创建了主窗口:

mainWindow = new BrowserWindow({width: 1280, height: 800, icon: iconPath});

路由文件在应用程序中点击PDF文档链接时会创建一个新窗口:
 router.get('/docs/:module/:type/:file', function(req, res) {
  openPDF(req.params.module,req.params.type,req.params.file);
  res.end();
});

// open pdf's in a new window
let newWindow;
const openPDF = function(module,filetype,filename) {

  let file = 'file:///' + __dirname + '/app/docs/' + module + '/' + filetype + '/' + filename;

  let newWindow = new BrowserWindow({
    width: 800, 
    height: 600,
    icon: iconPath,
    webPreferences: {
      nodeIntegration: false
    }
  });

  newWindow.setMenu(null);
  // newWindow.webContents.openDevTools();

  const param = qs.stringify({file: file});

  newWindow.loadURL('file://' + __dirname + '/app/pdfjs/web/viewer.html?' + param);

  newWindow.on('closed', function() {
    newWindow = null;
  });
}

当我关闭主窗口时,希望其他打开的窗口也能被关闭。我一直在试图实现这个功能(两个窗口都在同一进程中,所以据我所知我不能使用IPC)。然后我意识到,如果在主窗口关闭时调用app.quit(),它会关闭所有其他窗口:

// Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
    // quitting the app on main window close will close any other open windows
    app.quit();
  })

我的问题是这样做是否不好。它会结束所有打开的窗口而不需要用户输入,但由于所有新窗口都是不能编辑的pdf文件,所以不会有任何未保存的工作丢失。


如果以下答案对您有帮助,请确保点赞/接受它,以帮助可能遇到相同问题的其他人! - AP.
2个回答

3
你应该考虑使用类似 ReduxFlux 的状态容器框架来管理关闭。这样,当你从用户那里接收到关闭信号时,你可以发出一个信号来确保:
  • 提示用户是否保存了数据
  • 将应用程序的配置数据缓冲到文件中(以便在下一次启动时恢复上一次的状态
  • 然后运行 app.quit() 以确保安全退出
除此之外,如果你的应用程序不需要安全关闭,则仅使用 app.quit 就是关闭你的电子应用程序的完美方式。

1

有几个要点:

首先,你说“两个窗口都在主进程中,因此我不知道如何使用IPC”。实际上,这是不正确的。使用 BrowserWindow 本身启动另一个进程。在 Electron 生态系统(实际上是带有 Electron shell UI 和 API 添加组件的 Node 环境)中,当你生成 BrowserWindow 时,你正在创建新的渲染进程,每个渲染进程都可以通过 IPC 通道相互访问主进程和渲染进程。

其次,你问是否可以在 mainWindow 的“close”事件上使用 app.quit()。正如你所说,只要你不担心清理窗口/进程中的任何数据,这样做是可以的。即使你确实需要清理一些东西,你也可以在那个“close”事件函数中处理它。所以,不用担心,这样做并不会有什么问题。


当我尝试在新窗口中使用Renderer时,会出现关于模块未定义的错误。我在其他地方读到过,这是因为Renderer在主进程中不可用。这也是我使用“据我所知”的原因。我还是新手! - SmellydogCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接