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

Posted

技术标签:

【中文标题】使用 app.quit() 关闭电子应用程序中所有打开的窗口是不好的做法吗?【英文标题】:is it bad practice to use app.quit() to close all open windows in an electron app? 【发布时间】:2017-03-07 16:43:27 【问题描述】:

我有一个带有 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。

【问题讨论】:

如果下面的答案对您有所帮助,请务必点赞/接受,以帮助可能遇到相同问题的其他人! 【参考方案1】:

您应该考虑使用像Redux 或Flux 这样的状态容器框架来管理关闭。这样,当您收到用户的关闭信号时,您可以发送一个信号以确保:

在用户的数据未保存时提示用户 如果您愿意,可以将应用的配置数据缓冲到一个文件中(下次启动时从之前的状态恢复) 然后运行app.quit(),确保安全退出

除此之外,如果您的应用不需要安全关闭,那么 app.quit 本身就是关闭电子应用的绝佳方式。

【讨论】:

【参考方案2】:

几件事:

首先,您说“两个窗口都在主进程中,因此据我所知,我无法使用 IPC。”事实上,这不是真的。使用BrowserWindow 本身会启动另一个进程。在 Electron 生态系统(实际上是具有 Electron shell UI 和 API 插件的 Node 环境)中,当您生成 BrowserWindow 时,您正在创建新的渲染进程,并且每个渲染进程都有 IPC 通道可供主进程和渲染进程访问彼此。

其次,您询问有关在 mainWindow 上的 'close' 事件上使用 app.quit() 的问题(“我的问题是这样做是否是一件坏事。”)。正如您所说,只要您不担心清理窗口/进程中的任何数据,就可以这样做。即使您确实必须清理某些东西,您也可以在 'close' 事件函数中处理它。所以,别担心,这不是一件坏事。

【讨论】:

当我尝试在新窗口上使用渲染器时,我收到一个关于模块未定义的错误。我在其他地方读到这是因为渲染器在主进程上不可用。这也是我使用“尽我所知”一词的原因。我还是个新手!

以上是关于使用 app.quit() 关闭电子应用程序中所有打开的窗口是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QWebEngineUrlRequestInterceptor 在 app.quit() 之后仍然存在

如何在 laravel 中配置多封电子邮件 [关闭]

使用 rspec 进行 ActionMailer 测试 [关闭]

在发送或收到电子邮件时发送 webhook [关闭]

我怎么知道所有可能的错误登录[关闭]

如何使用 java 和 google gmail-api 获取收到的邮件? [关闭]