Базовое руководство по началу работы с электроном с React за минимальное количество шагов

Electron говорит, что если вы можете создать веб-сайт, вы можете создать кроссплатформенное настольное приложение. Наш любимый редактор кода VS Code использует электронное приложение, как и настольное приложение Whatsapp. Electron использует среду выполнения Node.js и механизм рендеринга Chromium для создания приложений с использованием HTML, CSS и JavaScript.

Почему React

React - это библиотека JavaScript с открытым исходным кодом для создания пользовательских интерфейсов или компонентов пользовательского интерфейса. Интересно изучить как функциональный (зацепки), так и классовый компонентный подход. React декларативен и основан на компонентах.

Create-React-App

Чтобы начать создание нового одностраничного приложения для реагирования, React Community предоставляет шаблонное приложение для быстрого старта разработки приложений.

Примечание. Убедитесь, что в вашей системе установлен Node.js.

Создание нашего приложения React

Когда ваш интерфейс командной строки указывает на папку, в которой вы хотите сохранить свое приложение, запустите

npx create-react-app electron-react-demo

который создает новое приложение реагирования под названием electronic-react-demo с необходимыми шаблонами.

cd electron-react-demo
npm start

чтобы запустить приложение React на локальном хосте.

Теперь вы можете просмотреть электронную реакцию-демонстрацию в браузере.
Локальный: http: // localhost: 3000

Структура папок electronic-react-demo будет следующей:

electronic-react-demo
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│ ├── favicon.ico
│ ├── index.html
│ └── manifest.json
└── src
│├── Приложение .css
│├── App.js
│├── App.test.js
│├── index.css
│├── index.js
│├── logo.svg
│├── serviceWorker.js
└── setupTests.js

Установка Electron

Устанавливаем электрон как dev-зависимость

npm install -D electron

В папке src создаем новый файл electronics.js для запуска электронного приложения.

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
let mainWindow;
function createWindow() {
mainWindow = new BrowserWindow({
        width: 1024, 
        height: 768,
        webPreferences:{
            nodeIntegration:true
        }
    });
mainWindow.loadURL('http://localhost:3000');
mainWindow.webContents.openDevTools();
mainWindow.on('closed', function () {
        mainWindow = null
    })
}
app.on('ready', createWindow);
app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') {
        app.quit()
    }
});
app.on('activate', function () {
    if (mainWindow === null) {
        createWindow()
    }
});

В Electron есть два процесса:
1. Главный процесс - electronics.js, запускаемый при запуске приложения, является основным процессом.
2. Процесс рендеринга - BrowserWindows созданный в основном процессе, может получить доступ к API рендерера для пользовательского интерфейса.

API app используется для управления жизненным циклом событий приложения и создает окно для события «готово». BrowserWindow API используется для создания окон браузера и управления ими. createWindow создает новое окно с указанной высотой и шириной и другими соответствующими спецификациями. Откройте инструменты разработчика Chrome с помощью openDevTools (). Созданное окно браузера прослушивает событие ‘closed’, чтобы закрыть окно. Браузер Windows загружает порт localhost, на котором работает приложение React.

Запуск приложения React в электронном виде

  1. Добавить точку входа в электрон

Мы добавляем основную точку входа в package.json, которая содержит все метаданные, связанные с проектом.

"main": "src/electron.js"

Кроме того, чтобы запустить электрон, мы добавляем цель запуска в электрон в package.json,

"electron":"electron ."

2. Выполнение приведенных ниже команд по отдельности открывает приложение Electron с содержимым create-react-app. Мы можем внести изменения в App.js для редактирования пользовательского интерфейса.

npm start
npm run electron

Здесь мы создали настольное приложение с минимальными усилиями при разработке.
Однако и сервер разработки React, и Electron должны запускаться отдельно и должны запускаться таким образом, чтобы Electron запускался после загрузки сценариев реакции.

3. Использование Foreman для упрощения запуска приложений

Foreman - это инструмент управления процессами, мы добавляем его с помощью

npm install -D foreman

Мы создаем Procfile для управления запуском двух процессов, то есть React webpack-dev-server и electronics как:

react:npm start
electron:npm run electron

Это решает нашу проблему отдельного запуска двух процессов. Мы добавляем новый файл с именем wait-for-response.js, чтобы решить нашу проблему, ожидая запуска сервера React dev и затем запускающего электрон.

// wait-for-react.js
const net = require('net');
const port = process.env.PORT ? (process.env.PORT - 100) : 3000;
process.env.ELECTRON_START_URL = `http://localhost:${port}`;
const client = new net.Socket();
let startedElectron = false;
const tryConnection = () => client.connect({port: port}, () => {
        client.end();
        if(!startedElectron) {
            console.log('starting electron');
            startedElectron = true;
            const exec = require('child_process').exec;
            exec('npm run electron');
        }
    }
);
tryConnection();
client.on('error', (error) => {
    setTimeout(tryConnection, 1000);
});

Этот простой скрипт узла проверяет, запущен ли React dev, а затем запускает электронный процесс. Модифицируем ранее добавленный Procfile

react:npm start
electron:npm run src/wait-for-react.js

4. Далее мы вносим некоторые изменения в наш файл package.json:

  1. Поскольку create-response-app создает index.html, который по умолчанию использует абсолютные пути. Таким образом, он не может загрузить его в Electron. Однако есть параметр конфигурации, позволяющий изменить это, чтобы установить свойство домашней страницы в package.json. Мы устанавливаем это свойство в текущем каталоге, и npm run build будет использовать его как относительный путь.
"homepage":"./"

2. npm start должен запустить наше приложение по желанию. Однако в настоящее время запускается только сервер разработки React. Поэтому мы вносим следующие изменения в package.json и Procfile соответственно,

“start”: “nf start -p 3000”, 
“electron-start”:”node src/wait-for-react”, 
“react-start”:”react-scripts start”

Окончательный Procfile,

react: npm run react-start
electron: npm run electron-start

Эти два дополнительных изменения заставляют нас использовать npm start для запуска приложения. Кроме того, мы добавляем файл .env с BROWSER=none в исходный каталог, чтобы сервер React dev не запускался в браузере. Наконец, наш файл package.json выглядит как

{
  "name": "electron-react-demo",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.5.0",
    "@testing-library/user-event": "^7.2.1",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-scripts": "3.4.3"
  },
  "scripts": {
    "start":"nf start -p 3000",
    "react-start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "electron": "electron ."
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "homepage":"./",
  "devDependencies": {
    "electron": "^10.0.0",
    "foreman": "^3.0.1"
  },
  "description": "This is a project demonstrating create-react-app with electron.",
  "main": "src/electron.js",
  "keywords": [
    "electron",
    "react"
  ],
  "author": "*******@bobble.ai",
  "license": "ISC"
}

Теперь запустите npm start, и там будет запущено наше электронное приложение с React Front end.

Чтобы получить доступ к файловой системе или использовать ipcRenderer Electron, нам нужно импортировать Electron в приложение React со следующим обходным путем:

const electron = window.require('electron');

В процессе разработки переменная среды ELECTRON_START_URL может указывать URL-адрес для mainWindow.loadURLelectron.js).

В процессе производства, если env var существует, мы используем его, иначе мы загружаем статический файл index.html.

const startUrl = process.env.ELECTRON_START_URL || url.format({
            pathname: path.join(__dirname, '/../build/index.html'),
            protocol: 'file:',
            slashes: true
        });
mainWindow.loadURL(startUrl);

Вскоре

Electron упаковывает множество API и может многое предложить разработчикам, например создание безрамочных приложений. Следите за обновлениями, чтобы узнать больше о захватывающих историях.

Спасибо и удачного кодирования!