Electron 常见问题解答
为什么我在安装 Electron 时遇到问题?
当运行 npm install electron
时,一些用户偶尔会遇到安装错误。
几乎在所有情况下,这些错误都是网络问题导致的,而不是 electron
npm 包的实际问题。类似 ELIFECYCLE
、EAI_AGAIN
、ECONNRESET
和 ETIMEDOUT
的错误都是此类网络问题的迹象。最佳解决方案是尝试切换网络,或稍等片刻再尝试重新安装。
如果通过 npm
安装失败,您也可以尝试直接从 electron/electron/releases 下载 Electron。
Electron 何时升级到最新 Chrome 版本?
Electron 的 Chrome 版本通常在新稳定版 Chrome 发布后一到两周内升级。此估计值不保证,并且取决于升级所涉及的工作量。
仅使用 Chrome 的稳定频道。如果重要的修复程序在 beta 或 dev 频道中,我们将向后移植它。
有关更多信息,请参阅 安全介绍。
Electron 何时升级到最新 Node.js 版本?
当 Node.js 发布新版本时,我们通常会等待大约一个月才升级 Electron 中的版本。这样可以避免受到新 Node.js 版本中引入的错误的影响,这种情况经常发生。
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 集成
// 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 中设置背景不会产生预期的效果。