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

FAQ по Electron

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

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

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

Также вы можете попытаться скачать Electron непосредственно из electron/electron/releases, если установка через npm терпит неудачу.

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

Chrome для Electron обычно выпускается в течение одной или двух недель после выпуска стабильной версии Chrome. Этот срок не является гарантированным и зависит от объема работ, связанных с обновлением.

Используется только стабильный канал Chrome. Если в бета- или dev-версии будет исправление, то мы перенесём его.

Для получения дополнительной информации, пожалуйста, просмотрите Введение в обеспечение безопасности.

Когда 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. Чтобы передавать данные между главным процессом и процессом рендерера, вы можете использовать ipcMain and ipcRenderer. Для прямого общения между веб-страницами, вы можете отправлять MessagePort из одной в другую или через основной процесс ipcRenderer.postMessage(). Последующая связь через порты сообщений прямая и не проходит через главный процесс.

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

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

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

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

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

на этот:

{ app, Tray }

У меня не получается использовать 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 доступен только в процессах рендеринга.

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

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

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

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

Для достижения этой цели, установите фон в конструкторе BrowserWindow:

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

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

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