Модуль app это уже готовый объект со своими методами, к которому мы можем подключаться
С помощью метода on электрон подписывает основной процесс на определённые события
src > main > index.js
Так же мы можем воспользоваться вполне конкретным промисом, который будет срабатывать при загрузке программы
Так же у нас есть ивенты на выход:
before-quit до закрытия всех окон приложения
will-quit после закрытия всех окон приложения
quit срабатывание при выходе из приложения
От смены порядка их выхода ничего не поменяется - они всегда имеют своё собственное время вызова
Так же мы имеем два метода выхода из приложения:
quit() - выполняет ивенты quit. Обычный выход.
exit() - выходит, выполняя только ивент quit и без спрашивания пользователей. Выход, который стоит использовать при ошибке
Методы getAppPath() (получить путь до программы) и getPath() (получить любой путь) позволяют получить доступ к пути на компьютере.
Конкретно тут при запуске дебаггера мы один раз тыкаем по выполнению и переходим к точке останова до того момента, где мы сгенерировали переменную application.
А тут уже мы можем получить путь до приложения
Дальше идёт функция getPath(), через которую мы можем получить важные пути:
temp - временные данные
userData - все данные связанные с пользователем
logs - папка с логами программы
exe - папка программы
Все имена, которые мы можем вложить в getPath()
name string - You can request the following paths by the name:
>- home User’s home directory.
>- appData Per-user application data directory, which by default points to:
> - %APPDATA% on Windows
> - $XDG_CONFIG_HOME or ~/.config on Linux
> - ~/Library/Application Support on macOS
>- userData The directory for storing your app’s configuration files, which by default is the appData directory appended with your app’s name. By convention files storing user data should be written to this directory, and it is not recommended to write large files here because some environments may backup this directory to cloud storage.
>- sessionData The directory for storing data generated by Session, such as localStorage, cookies, disk cache, downloaded dictionaries, network state, devtools files. By default this points to userData. Chromium may write very large disk cache here, so if your app does not rely on browser storage like localStorage or cookies to save user data, it is recommended to set this directory to other locations to avoid polluting the userData directory.
>- temp Temporary directory.
>- exe The current executable file.
>- module The libchromiumcontent library.
>- desktop The current user’s Desktop directory.
>- documents Directory for a user’s “My Documents”.
>- downloads Directory for a user’s downloads.
>- music Directory for a user’s music.
>- pictures Directory for a user’s pictures.
>- videos Directory for a user’s videos.
>- recent Directory for the user’s recent files (Windows only).
>- logs Directory for your app’s log folder.
> - crashDumps Directory where crash dumps are stored.
Так же у нас может быть только один запущенный экземпляр app. Дело в том, что если бы у нас было несколько запущенных основных процессов, то все бы они отправляли запросы на один API и это вызвало бы различные конфликты.
Чтобы решить проблему, пользователю дали возможность запускать несколько окон в приложении вместо запуска одного и того же приложения несколько раз
Однако нужно упомянуть, что мы можем запустить второй экземпляр программы через консоль, что может привести к неприятным последствиям. Для решения этой проблемы, можно написать:
Модуль BrowserWindow хранит в себе класс, который предоставляет нам конструктор нового браузерного окна, которое позволяет рендерить контент в приложении
Уже метод loadFile() рендерит структуру страницы из нужного нам файла
Так же, в процессе разработки нашего приложения, мы можем столкнуться с тем, что у нас могут не работать некоторые вещи (по типу импортов) на фронте компьютера.
Чтобы решить проблему, мы можем воспользоваться свойством веб-настройки nodeIntegration, который предоставит работу с приложением и компьютером из devtools.
Это небезопасная опция, которой не стоит пользоваться, но во время разработки ей можно пользоваться.
Заменить эту настройку можно будет вдальнейшем прелоадом
Далее мы так же можем избавиться от фликер-эффекта (эффект, при котором у нас сначала рендерится сама HTML-структура, а уже затем подгружаются стили). Для этого мы можем задать ивент, при котором окно покажется только после полного рендера страницы и так же можем задать цвет для нашего окна браузера по умолчанию (чтобы не смотреть на белое окно)
Так же мы можем задать максимальный и минимальный размер нашего окна через модуль screen, который хранит в себе методы и свойства работы с размером окна пользователя
Дальше уже идут свойства работы с окном приложения
frame: false - скроет рамку у приложения впринципе
titleBarStyle: "hidden" - имеет несколько свойств (почти все для мака), которые определяют положение элементов кнопок и самой рамки
И теперь нам нужно создать искуственную драг-область, за которую мы сможем перетаскивать приложение, так как у нас сейчас нет верха
Сразу нужно сказать, что мы либо используем стоковое меню, либо создаём своё меню полностью с нуля.
Это самый первый способ создания меню приложения (самый долгий и длинный с повторением кода):
Так же есть более короткий способ создать новое меню, через Menu.buildFromTemplate([{}])
Самое основное удобство последнего подхода заключается в том, что мы можем вынести шаблон в любое другое место кода или проекта, чтобы не разводить мусорку
Так же электрон позволяет нам пользоваться его собственными элементами меню в нашем приложении
Так же мы можем комбинировать подходы в реализации приложения
А тут уже показан пример создания контекстного меню, которое вызывается на ПКМ
Этот модуль позволяет создавать иконку трея нашего приложения.
Первым делом, нам нужно установить в вебпак лоадер, который будет компилировать нормально изображения в наш выводной проект.
По сути очень важно, чтобы вебпак компилировал файл со своим именем, так как в конце у иконки должен быть суффикс Template, чтобы на мак-устройствах иконка выполняла свою анимацию корректно
Дальше уже создаём инстанс трея со всеми входными параметрами
Теперь мы видим саму иконку приложения в трее, его тултип и можем выполнить логику, которая повешана на тултип.
Так же нужно отметить, что мы можем подписаться на разные клики мышью, чтобы реализовать разную логику.
И теперь мы можем создать менюшку для нашего трея:
На ПКМ программа туглится, на ЛКМ открывается менюшка