Electron:2021年如何通过js关闭应用程序?

Den*_*han 0 javascript node.js electron

我想通过js关闭Electron App。

"electron": "^13.1.7"
Run Code Online (Sandbox Code Playgroud)

我仔细阅读了这些问题:

但这些都不适合我。


以下所有测试均基于官方的电子快速启动

  1. 根据上面问题的答案,我得到了这些代码:

索引.html

"electron": "^13.1.7"
Run Code Online (Sandbox Code Playgroud)

main.js

  <body>
    <button id="close-app">
        close
    </button>
    <script src="./renderer.js"></script>
  </body>
Run Code Online (Sandbox Code Playgroud)

没有任何影响或错误。

没有任何影响或错误。

似乎代码从未运行过,我console.log('run')在上面添加了一个addEventListener,但控制台中没有打印任何内容。


  1. 根据文档,我得到了这些代码:

(不改变官方的电子快速启动,只改变preload.jsindex.html

索引.html

与上面相同

预加载.js

const { app } = require('electron');
window.addEventListener('DOMContentLoaded', () => {
  document.getElementById("close-app").addEventListener("click", function (e) {
      app.quit();
  })
})
Run Code Online (Sandbox Code Playgroud)

Uncaught TypeError: Cannot read property 'quit' of undefined只 得到未捕获的类型错误:无法读取未定义的属性“退出”


那么,如何通过js关闭Electron App呢?

非常感谢任何人的帮助!

aab*_*leh 8

Electron 具有仅在主进程中工作的模块,app以及仅在渲染器进程中工作的模块,ipcRenderer以及常见且可以在两个进程中运行的模块

我建议阅读Electron 文档中的这篇文章,它解释了流程模型

预加载脚本包含在 Web 内容开始加载之前在渲染器进程中执行的代码。这些脚本在渲染器上下文中运行,但通过访问 Node.js API 被授予更多权限。

因为该app模块是一个主进程模块,如果尝试从预加载脚本(渲染器进程)访问它,app将会出现未定义的情况

// in preload.js
const { app } = require('electron');

console.log(app); // undefined
Run Code Online (Sandbox Code Playgroud)

相反,您应该使用进程间通信来告诉主进程退出

// in main.js
const { app, ipcMain } = require('electron');

ipcMain.handle('quit-app', () => {
  app.quit();
});

// in preload.js
const { ipcRenderer } = require('electron');

window.addEventListener('DOMContentLoaded', () => {
  document.getElementById('close-app').addEventListener('click', () => {
      ipcRenderer.invoke('quit-app');
  });
});
Run Code Online (Sandbox Code Playgroud)