Electron 常见问题¶
为什么我在安装 Electron 时遇到问题?¶
当运行 npm install electron 时,一些用户偶尔会遇到安装错误。
在几乎所有情况下,这些错误都是网络问题造成的,而不是 electron npm 包本身的问题。诸如 ELIFECYCLE、EAI_AGAIN、ECONNRESET 和 ETIMEDOUT 之类的错误都表明存在此类网络问题。最好的解决方法是尝试切换网络,或者稍等片刻再重新安装。
如果通过 npm 安装失败,您也可以尝试直接从 GitHub Releases 下载 Electron。
如果您需要通过自定义镜像或代理安装 Electron,请参阅高级安装文档以了解更多详情。
Electron 二进制文件是如何下载的?¶
当您运行 npm install electron 时,会下载主要的 bin 脚本。一旦运行该脚本(例如通过 npx electron),对应版本的 Electron 二进制文件将通过 install-electron 脚本动态下载到您项目的 node_modules 文件夹中。
下载逻辑由 @electron/get 工具包在底层处理。
您也可以手动调用 install-electron 脚本。
Electron 何时升级到最新的 Chromium?¶
Electron 的每个新主版本都会伴随 Chromium 主版本的升级。Electron 每 8 周发布一次,因此能在 Chromium 上游发布的同一天引入每隔一个的 Chromium 主版本。安全修复会提前移植到稳定发布渠道。
有关更多详情,请参阅Electron 发布文档,或访问 releases.electronjs.org 查看我们的发布状态仪表板。
Electron 何时升级到最新的 Node.js?¶
当有新版本的 Node.js 发布时,我们通常会等待大约一个月后再升级 Electron 中的 Node.js。这样可以避免受到新版本 Node.js 中引入的 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 集成:
// 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 中设置 background 并不会产生预期效果。
类继承不适用于 Electron 内置模块¶
Electron 类无法使用 extends
关键字(也称为类继承)进行子类化。由于该功能会给 Electron 内部的 C++/JavaScript 互操作带来额外复杂性,Electron 从未实现此功能。
有关更多信息,请参阅 electron/electron#23。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron