Реализуем получение данных на фронте от мэин-процесса
Электрон предоставляет нам глобальную шину IPC (Item Process Communication), которая реализует общение серверной и клиентской части приложения. Практически любой процесс может открыть канал, который будут слушать все подписанные на этот канал процессы
Сообщения с бэка в рендерер-процесс могут быть посланы через webContents.send. Уже через ipcRenderer можно отправить запрос из рендерер-процесса на бэк (в основной процесс) либо слушать сообщения по какому-то каналу.
Попробуем отправить сообщение из мэин-процесса в рендерер-процесс:
Тут нужно отметить, что мы создаём канал для конкретного окна window.webContents.send - тут окно window
main > index.js
ipcRenderer тут принимает в себя два аргумента: event - информация о самом событии (сообщении) и data - само переданное сообщение
renderer > index.js
Реализуем получение данных от рендерер-процесса на мэин-процессе
Тут нам уже понадобится общая шина на все рендерер-процессы, из которой можно будет подписаться в мэйне. Конкретно этим модулем будет ipcMain
Тут уже главное отличие заключается в том, что мы создаём канал через ipcRenderer
Создаём канал в рендерер-процессе, из которого отправим данные на “сервер”
renderer > index.js
main > index.js
Реализуем систему запросов и ответов между основным и рендерер-процессом
Конкретно нам нужно:
с фронта отправить запрос на бэк
чтобы бэк обработал информацию
и вернул нам этот запрос обратно
на фронте мы должны получить и вывести эти данные пользователю
В коде ниже представлена реализация отправки данных. По нажатию на кнопку мы вызываем метод loadAndDisplayData, внутри которого данные отправятся и примутся через определённый промежуток времени. Внутри loadAndDisplayData мы вызываем loadData и тут сталкиваемся с проблемой, что нам нужно получить данные, которые приходят в метод листенера - а именно в ipcRenderer.once().
renderer > index.js
Чтобы решить проблему, нам нужно воспользоваться Promise API, который и вернёт нам вызванные данные
renderer > index.js
В основном процессе генерируем новое значение и возвращаем его в рендерер процесс
main > index.js
Так же хорошей практикой будет прописывать обработку ошибок на случай непредвиденных ситуаций
renderer > index.js
015 Модуль remote
На данный момент этот модуль полностью закрыт в новых версиях Electron. Вместо remote нужно использовать preload-скрипты
С помощью модуля remote, мы можем пользоваться определёнными модулями из основного процесса
Ну и так же можно получить остальные элементы
016 Preload Script
Эта настройка откроет devTools отдельным окном
Как и упоминалось ранее - использовать открытого доступа к файловой системе из инструментов разработчика - не есть хорошая практика. Вместо этого стоит использовать preload-скрипт, который уже, в свою очередь, предоставит нам нужный функционал нашей системе.
Уберём свойство nodeIntegration и заменим его подключением preload
main > index.js
Самое главное, что мы получили сейчас - это отсутствие доступа к модулям nodejs и файловой системе из devTools
Предназначен этот модуль для создания узких, контролируемых интерфейсов через которые renderer сможет взаимодействовать с Node.js API
чекер_сети
Конкретно сейчас мы реализуем возможность определять, подключено ли приложение к сети. В preload мы запишем функционал, который будет создавать два канала, оповещающих о том, что приложение подключено к интернету. В main процессе мы будем подписываться на эти два канала и выводить сообщение о том, что приложение подключено или отключено от интернета
Чтобы проверить работоспособность, кликни сюда:devtools
preload > index.js
main > index.js
Так же мы можем настраивать логику работы приложения, если у пользователя нет интернета.
Например, когда пользователь что-то делает на компьютере, то мы сохраняем данные на компьютер, а когда интернет появляется, мы можем синхронизировать эти данные с сервером.
Это, по сути, пример использования API renderer процесса в main процессе с помощью preload скрипта
main > index.js
Теперь передаём процессы из preload в renderer процесс.
В прелоад подключим contextBridge, который позволит создать псевдоним для передаваемых функций и вложим в эти свойства функции, которые доступны только на бэке (в ноде).
preload > index.js
renderer > index.js
017 API Браузера
В renderer процессе мы имеем доступ ко всем функциям браузера, которые мы можем писать в нативном JS
Так же нужно сказать, что так как мы работаем с бнраузерным API, то у нас есть доступ к веб SQL, локальному кэшу и остальным уникальным функциям браузеров
Объект Notification создаёт системное уведомление. Мы можем вызывать его как API браузера на нашем ПК.
Так как мы пишем приложение в одном браузере, то, как упомяналось ранее, мы работаем только над одним проектом и можем не думать над кросс-браузерностью