Создание десктопного приложения с помощью Electron

Electron: Создаем кроссплатформенное десктопное приложение на Node.js и JavaScript

Введение
Electron — фреймворк, позволяющий создавать нативные десктопные приложения, используя веб-технологии: HTML, CSS и JavaScript. Под капотом Electron объединяет среду выполнения Node.js и рендер движок Chromium. Такие приложения, как Visual Studio Code, Slack и Discord, построены на Electron.

Как это работает?
Electron-приложение состоит из двух основных процессов:

  1. Главный процесс (Main Process): Управляет жизненным циклом приложения, создает окна. Работает в среде Node.js.

  2. Процесс рендерера (Renderer Process): Отображает пользовательский интерфейс (ваш HTML/CSS/JS). Это обычная веб-страница, запущенная в Chromium.

Пример: Простой менеджер задач (To-Do List)

Создадим простое приложение для управления списком задач.

  1. Инициализация проекта:

mkdir my-electron-todo
cd my-electron-todo
npm init -y

      2. Установка Electron:

npm install —save-dev electron

      3. Изменение package.json:

Добавьте точку входа для приложения.

{
«name»: «my-electron-todo»,
«version»: «1.0.0»,
«description»: «»,
«main»: «main.js», // Указываем главный файл
«scripts»: {
«start»: «electron .», // Добавляем скрипт для запуска
«test»: «echo \»Error: no test specified\» && exit 1″
},
«devDependencies»: {
«electron»: «^28.0.0»
}
}

      4. Создание главного процесса (main.js):

// Подключаем модули Electron
const { app, BrowserWindow } = require(‘electron’);
const path = require(‘path’);

// Функция для создания главного окна приложения
function createWindow() {
// Создаем окно браузера
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true, // Разрешаем использовать Node.js в процессе рендерера
contextIsolation: false // Для простоты примера отключаем изоляцию контекста
}
});

// Загружаем файл index.html в окно
mainWindow.loadFile(‘index.html’);

// Опционально: открываем инструменты разработчика
// mainWindow.webContents.openDevTools();
}

// Этот метод будет вызван, когда Electron закончит инициализацию
app.whenReady().then(createWindow);

// Выйти, когда все окна закрыты (кроме macOS)
app.on(‘window-all-closed’, () => {
if (process.platform !== ‘darwin’) {
app.quit();
}
});

// На macOS приложение перезапускается, когда пользователь кликает на иконку в доке
app.on(‘activate’, () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});

      5. Создание интерфейса (index.html):

<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″>
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″>
<title>My Electron To-Do List</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
#taskInput { padding: 10px; width: 300px; }
button { padding: 10px 15px; margin-left: 10px; }
ul { list-style: none; padding: 0; }
li { padding: 8px; background: #f4f4f4; margin-bottom: 5px; display: flex; justify-content: space-between; }
.delete-btn { background: red; color: white; border: none; cursor: pointer; }
</style>
</head>
<body>
<h1>Мой Список Задач</h1>
<div>
<input type=»text» id=»taskInput» placeholder=»Введите новую задачу…»>
<button onclick=»addTask()»>Добавить</button>
</div>
<ul id=»taskList»></ul>

<script src=»renderer.js»></script>
</body>
</html>

6. Создание логики интерфейса (renderer.js):

// Эта часть выполняется в процессе рендерера (в контексте веб-страницы)
function addTask() {
const taskInput = document.getElementById(‘taskInput’);
const taskText = taskInput.value.trim();

if (taskText === ») return;

const taskList = document.getElementById(‘taskList’);

// Создаем новый элемент списка
const li = document.createElement(‘li’);
li.innerHTML = `
<span>${taskText}</span>
<button class=»delete-btn» onclick=»removeTask(this)»>Удалить</button>
`;

taskList.appendChild(li);
taskInput.value = »; // Очищаем поле ввода
}

function removeTask(button) {
const li = button.parentElement;
li.remove();
}

// Обработка нажатия Enter в поле ввода
document.getElementById(‘taskInput’).addEventListener(‘keypress’, function(e) {
if (e.key === ‘Enter’) {
addTask();
}
});

7. Запуск приложения:

npm start

Описание кода:

  • main.js: Управляет созданием окна приложения. BrowserWindow — это класс для создания окон.

  • index.html: Определяет структуру и стили интерфейса. Это обычный HTML.

  • renderer.js: Содержит логику взаимодействия с пользователем (добавление, удаление задач). Это обычный JavaScript для фронтенда.

Заключение

Вы только что создали полнофункциональное десктопное приложение, используя веб-технологии. Electron стирает границы между вебом и десктопом, позволяя разработчикам быстро создавать кроссплатформенные приложения. Дальнейшие шаги могут включать упаковку приложения в установочный файл (.exe, .dmg, .deb) с помощью electron-builder.