使用 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() 之后仍然存在