Electron 常见问题解答
我为什么难以安装 Electron?
在运行 npm install electron 时,有些用户偶尔会遇到安装错误。
在几乎所有情况下,这些错误都是由于网络问题引起的,而不是 electron npm 包本身的问题。诸如 ELIFECYCLE、EAI_AGAIN、ECONNRESET 和 ETIMEDOUT 等错误都表明存在此类网络问题。最佳的解决方法是尝试更换网络,或者稍等片刻后再次尝试安装。
如果通过 npm 安装失败,您也可以尝试直接从 GitHub Releases 下载 Electron。
如果您需要通过自定义镜像或代理安装 Electron,请参阅 高级安装 文档了解更多详情。
Electron 二进制文件是如何下载的?
当您运行 npm install electron 时,对应版本的 Electron 二进制文件会通过 npm 的 postinstall 生命周期脚本下载到您项目的 node_modules 文件夹中。
此逻辑由 @electron/get 实用工具包在后台处理。
Electron 何时会升级到最新的 Chromium?
Electron 的每个新主版本都会伴随 Chromium 的一个主版本升级。通过每 8 周发布一次,Electron 能够与 Chromium 上游发布同一天拉入每一个 Chromium 的主版本。安全修复将在稳定发布渠道提前向后移植。
有关更多详细信息,请参阅 Electron 发布 文档,或访问 releases.electronjs.org 查看我们的发布状态仪表板。
Electron 何时会升级到最新的 Node.js?
当新的 Node.js 版本发布时,我们通常会等待大约一个月后再升级 Electron 中使用的版本。这样可以避免受新 Node.js 版本中引入的 bug 的影响,这些 bug 经常发生。
Node.js 的新功能通常通过 V8 升级引入,由于 Electron 使用 Chrome 浏览器提供的 V8,因此新 Node.js 版本中闪亮的新 JavaScript 功能通常已经包含在 Electron 中。
如何在网页之间共享数据?
要在网页(渲染进程)之间共享数据,最简单的方法是使用浏览器中已有的 HTML5 API。其中比较好的选择有 Storage API、localStorage、sessionStorage 和 IndexedDB。
或者,您也可以使用 Electron 提供的 IPC 原语。要在主进程和渲染进程之间共享数据,可以使用 ipcMain 和 ipcRenderer 模块。要直接在网页之间进行通信,您可以将 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 中会插入一些额外的符号,如 module、exports、require。这会给某些库带来问题,因为它们希望插入同名的符号。
要解决此问题,您可以在 Electron 中关闭 Node.js 集成
// 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 屏幕上的字体看起来可能会模糊。例如:
![]()
亚像素抗锯齿需要包含字体字形的图层的背景是非透明的。(有关更多信息,请参阅 此问题)。
为了实现此目标,请在 BrowserWindow 的构造函数中设置背景:
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({
backgroundColor: '#fff'
})
此效果仅在(某些?)LCD 屏幕上可见。即使您看不到区别,您的某些用户也可能看到。最好始终以此方式设置背景,除非您有理由不这样做。
请注意,仅在 CSS 中设置背景不会产生预期的效果。
类继承在 Electron 内置模块中不起作用
Electron 类不能使用 extends 关键字进行子类化(也称为类继承)。此功能从未在 Electron 中实现,因为它会增加 Electron 内部 C++/JavaScript 互操作性的复杂性。
有关更多信息,请参阅 electron/electron#23。