跳转到主要内容

Electron 常见问题解答

为什么我安装 Electron 时遇到问题?

当运行 npm install electron 时,有些用户偶尔会遇到安装错误。

在绝大多数情况下,这些错误是由于网络问题造成的,而不是 electron npm 包的实际问题。 诸如 ELIFECYCLEEAI_AGAINECONNRESETETIMEDOUT 之类的错误都表明存在此类网络问题。最佳解决方案是尝试切换网络,或者稍等片刻后再试安装。

如果通过 npm 安装失败,您还可以尝试直接从 GitHub Releases 下载 Electron。

如果您需要通过自定义镜像或代理安装 Electron,请参阅 高级安装 文档以获取更多详细信息。

Electron 二进制文件是如何下载的?

当您运行 npm install electron 时,相应版本的 Electron 二进制文件会通过 npm 的 postinstall 生命周期脚本下载到您项目的 node_modules 文件夹中。

此逻辑由 @electron/get 工具包在底层处理。

Electron 何时升级到最新的 Chromium?

Electron 的每个新主要版本都包含 Chromium 的主要版本升级。 通过每 8 周发布一次,Electron 能够在上游发布同一天引入每个其他主要 Chromium 版本。 安全补丁将在提前回溯到稳定发布渠道。

有关更多详细信息,请参阅 Electron Releases 文档或 releases.electronjs.org 以查看我们的发布状态仪表板。

Electron 何时升级到最新的 Node.js?

当发布新版本的 Node.js 时,我们通常会等待大约一个月后再升级 Electron 中的版本。 这样可以避免受到新 Node.js 版本引入的错误影响,而这种情况经常发生。

Node.js 的新功能通常由 V8 升级带来,由于 Electron 使用 Chrome 浏览器提供的 V8,因此新 Node.js 版本的闪亮新 JavaScript 功能通常已经包含在 Electron 中。

如何共享网页之间的数据?

要在网页(渲染进程)之间共享数据,最简单的方法是使用浏览器中已经可用的 HTML5 API。 好的候选者包括 Storage APIlocalStoragesessionStorageIndexedDB

或者,您可以使用 Electron 提供的 IPC 原语。 要在主进程和渲染进程之间共享数据,可以使用 ipcMainipcRenderer 模块。 要直接在网页之间进行通信,您可以从一个网页发送一个 MessagePort 到另一个网页,可能通过主进程使用 ipcRenderer.postMessage()。 通过消息端口的后续通信是直接的,不会绕过主进程。

我的应用程序的托盘在几分钟后消失了。

当用于存储托盘的变量被垃圾回收时,会发生这种情况。

如果您遇到此问题,以下文章可能会有所帮助

如果您想要一个快速修复,可以通过将您的代码从以下形式更改为以下形式来使变量全局

const { app, Tray } = require('electron')

app.whenReady().then(() => {
const tray = new Tray('/path/to/icon.png')
tray.setTitle('hello world')
})

到这个

const { app, Tray } = require('electron')

let tray = null
app.whenReady().then(() => {
tray = new Tray('/path/to/icon.png')
tray.setTitle('hello world')
})

我无法在 Electron 中使用 jQuery/RequireJS/Meteor/AngularJS。

由于 Electron 的 Node.js 集成,一些额外的符号被插入到 DOM 中,例如 moduleexportsrequire。 这给一些库带来了问题,因为它们想要插入具有相同名称的符号。

要解决此问题,您可以关闭 Electron 中的 node 集成

// In the main process.
const { BrowserWindow } = require('electron')

const win = new BrowserWindow({
webPreferences: {
nodeIntegration: false
}
})
win.show()

但是,如果您想保留使用 Node.js 和 Electron API 的能力,则必须在包含其他库之前重命名页面中的符号

<head>
<script>
window.nodeRequire = require;
delete window.require;
delete window.exports;
delete window.module;
</script>
<script type="text/javascript" src="jquery.js"></script>
</head>

require('electron').xxx 未定义。

在使用 Electron 的内置模块时,您可能会遇到如下错误

> require('electron').webFrame.setZoomFactor(1.0)
Uncaught TypeError: Cannot read property 'setZoomLevel' of undefined

您很可能在错误进程中使用该模块。 例如,electron.app 只能在主进程中使用,而 electron.webFrame 仅在渲染进程中可用。

字体看起来模糊,这是什么,我该怎么办?

如果 次像素抗锯齿 被禁用,那么 LCD 屏幕上的字体可能会看起来模糊。 例如

Subpixel rendering example

次像素抗锯齿需要包含字体字形的图层的非透明背景。 (有关更多信息,请参阅 此 issue)。

要实现此目标,请在 BrowserWindow 的构造函数中设置背景

const { BrowserWindow } = require('electron')

const win = new BrowserWindow({
backgroundColor: '#fff'
})

该效果仅在(某些?)LCD 屏幕上可见。 即使您没有看到差异,您的某些用户也可能会看到。 最好始终以这种方式设置背景,除非您有不这样做的好理由。

请注意,仅在 CSS 中设置背景不会产生预期的效果。

类继承无法与 Electron 内置模块一起工作

由于 Electron 的内部 C++/JavaScript 互操作的复杂性,Electron 类无法使用 extends 关键字(也称为类继承)进行子类化。 此功能从未在 Electron 中实现。

有关更多信息,请参阅 electron/electron#23