Перейти к основному содержанию

FAQ по Electron

Проблемы, возникающие при установке Electron

При выполнении команды npm install electron, некоторые пользователи сталкиваются с проблемами установки.

В большинстве случаев, эти ошибки являются результатом проблем сети и не связаны с npm пакетом electron. Такие ошибки, как ELIFECYCLE, EAI_AGAIN, ECONNRESET иETIMEDOUT возникают в результате проблем с сетью. Лучшее решение - попытаться переключить сеть, или немного подождать, и попытаться установить снова.

You can also attempt to download Electron directly from GitHub Releases if installing via npm is failing.

If you need to install Electron through a custom mirror or proxy, see the Advanced Installation documentation for more details.

How are Electron binaries downloaded?

When you run npm install electron, the Electron binary for the corresponding version is downloaded into your project's node_modules folder via npm's postinstall lifecycle script.

This logic is handled by the @electron/get utility package under the hood.

When will Electron upgrade to latest Chromium?

Every new major version of Electron releases with a Chromium major version upgrade. By releasing every 8 weeks, Electron is able to pull in every other major Chromium release on the very same day that it releases upstream. Security fixes will be backported to stable release channels ahead of time.

See the Electron Releases documentation for more details or releases.electronjs.org to see our Release Status dashboard.

Когда Electron получит последнее обновление Node.js?

После выпуска новой версии Node.js, мы обычно ждем примерно месяц до обновления в Electron. Это помогает избежать ошибок, которые присутствуют в новых версиях Node.js, что случается довольно часто.

Новые возможности Node.js обычно входят в обновления V8, так как Electron использует V8, поставляемый с браузером Chrome, новейшие возможности JavaScript в новой версии Node.js обычно уже входят в Electron.

Как передавать данные между страницами?

Для передачи данных между веб-страницами (графическими процессами) самым простым способом является использование HTML5 API, который уже доступен в браузерах. Хорошими вариантами будут: Storage API, localStorage, sessionStorage и IndexedDB.

В качестве альтернативы вы можете использовать IPC примитивы, предоставленные Electron. To share data between the main and renderer processes, you can use the ipcMain and ipcRenderer modules. To communicate directly between web pages, you can send a MessagePort from one to the other, possibly via the main process using ipcRenderer.postMessage(). Последующая связь через порты сообщений прямая и не проходит через главный процесс.

Трей моего приложения исчезает через несколько минут.

Это происходит, когда переменная, используемая для хранения трея уничтожается сборщиком мусора.

Если Вы столкнулись с этой проблемой, могут оказаться полезными следующие статьи:

Если Вы хотите это быстро исправить, Вы можете сделать переменную глобальной, заменив для этого следующий код:

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

app.whenReady().then(() => {
const tray = new Tray('/путь/до/иконки.png')
tray.setTitle('привет мир')
})

на этот:

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

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

У меня не получается использовать jQuery/RequireJS/Meteor/AngularJS в Electron.

В связи с интеграцией Node.js с Electron, существуют некоторые дополнительные ключевые слова вставляемые в DOM, такие как: module, exports, и require. Это вызывает проблемы для некоторых библиотек, так как они пытаются вставить такие же имена.

Для решения этой проблемы, Вы можете отключить интеграцию node в Electron:

// В основном процессе.
const { BrowserWindow } = require('electron')

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

Но если Вы хотите сохранить возможность использования Node.js или API Electron, Вы должны переименовать переменные на странице перед подключением других библиотек:

<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 is undefined (не определено).

При использовании встроенного модуля Electron может возникнуть подобная ошибка:

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

Скорее всего, Вы используете модуль в неправильном процессе. Например electron.app может быть использован только в главном процессе, в то время как electron.webFrame доступен только в процессах рендеринга.

Шрифт выглядит размытым, что это и что я могу с этим сделать?

Если субпиксельный анти-алиасинг выключен, то шрифты на ЖК-экранах могут быть размытыми. Пример:

Пример отрисовки субпикселей

Для анти-алиасинга подпикселя требуется непрозрачный фон, содержащий глифы шрифта. (См. эту проблему для получения дополнительной информации).

To achieve this goal, set the background in the constructor for BrowserWindow:

const { BrowserWindow } = require('electron')

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

Эффект виден только на (некоторых?) ЖК-экранах. Даже если вы не видите разницы, некоторые пользователи видят. Лучше всего ставить фон таким образом, если же у вас есть причины не делать так.

Обратите внимание, что только настройка фона в CSS не имеет желаемого эффекта.

Class inheritance does not work with Electron built-in modules

Electron classes cannot be subclassed with the extends keyword (also known as class inheritance). This feature was never implemented in Electron due to the added complexity it would add to C++/JavaScript interop in Electron's internals.

For more information, see electron/electron#23.