Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Жизненный цикл приложения

Жизненный цикл — это этапы жизни программы: запуск, работа, закрытие окон, выход. Объект app из модуля electron сообщает о каждом этапе событием. Правильно обработать их нужно потому, что Windows, Linux и macOS ведут себя по-разному.

Готовность

Создавать окна можно только после того, как Electron инициализировался. Для этого есть промис app.whenReady():

// main.js
const { app, BrowserWindow } = require('electron');
 
function createWindow() {
  const win = new BrowserWindow({ width: 900, height: 600 });
  win.loadFile('index.html');
}
 
app.whenReady().then(() => {
  createWindow();
});

Промис выполнится один раз после запуска, и откроется окно. Это то же самое, что подписка на событие ready, но удобнее.

Закрытие всех окон

В Windows и Linux программа обычно завершается, когда закрыто последнее окно. В macOS она остаётся в Dock, пока пользователь не выберет «Завершить» или не нажмёт Cmd+Q:

// main.js
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

process.platform равен 'darwin' в macOS, 'win32' в Windows и 'linux' в Linux. На Windows закрытие окна завершит программу, а на Mac она продолжит работать без окон.

Повторная активация

Если в macOS у программы нет окон и пользователь щёлкнул её значок в Dock, срабатывает событие activate. В ответ нужно снова открыть окно:

// main.js
app.whenReady().then(() => {
  createWindow();
 
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

BrowserWindow.getAllWindows() возвращает массив открытых окон. Подписку делают внутри whenReady, чтобы окно не создавалось раньше времени.

Выход

СобытиеКогда срабатывает
readyElectron готов, можно создавать окна
window-all-closedЗакрыто последнее окно
activateЩелчок по значку в Dock (macOS)
before-quitПрограмма начинает завершаться
will-quitВсе окна закрыты, сейчас будет выход
quitПрограмма завершается

Событие before-quit удобно для последнего сохранения:

// main.js
app.on('before-quit', () => {
  console.log('Программа закрывается');
});

Сообщение появится в терминале при выходе из программы.

Частая ошибка

Если создать окно прямо в начале main.js, без whenReady, Electron остановится с ошибкой Cannot create BrowserWindow before app is ready. Всё, что работает с окнами, меню и треем, вызывайте после готовности: внутри app.whenReady().then(...).

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.