Жизненный цикл приложения
Жизненный цикл — это этапы жизни программы: запуск, работа, закрытие окон, выход. Объект 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, чтобы окно не создавалось раньше времени.
Выход
| Событие | Когда срабатывает |
|---|---|
ready | Electron готов, можно создавать окна |
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(...).