Найти в Дзене

Как создать кросс-платформенное десктопное приложение. Electron, React, TypeScript, vite.

Привет ! 👋 Не давно была новость о то что меню пуск в windows 11 это приложение на react-native. В этой статье расскажу, как можно сделать меню пуск как в windows, но вместо react-native буду использовать просто react, а десктоп получим через electron. Код приложения можно найти тут 👈 В подробностях рассказывать не буду, в описании на репозитории проекта есть гайд как запустить приложение. Кода там немного, пару часов хватит чтобы понять что к чему, ну и я ниже покажу на что обратить внимание. Есть такой инструмент для electron, electron-forge. Он предоставляет готовый шаблон для разработки, а это уже пол дела ! 😁
Запускается все просто: npx create-electron-app@latest my-app --template=vite-typescript вместо my-app - любое ваше название приложения так же есть и другие шаблоны: Мне интерес vite-typescript. В шаблоне ни много ни мало файлов и конфигов, но на самом деле не все так страшно как на первый взгляд может показаться. После этого можно запустить npm start и появиться окно при
Оглавление

Привет ! 👋

Меню пуск в macos. Приложение на electron.
Меню пуск в macos. Приложение на electron.
Не давно была новость о то что меню пуск в windows 11 это приложение на react-native.
Пользователи выяснили, что кнопка пуск в Windows 11 — приложение на React Native, которое загружает ядро ЦП по клику

Введение

В этой статье расскажу, как можно сделать меню пуск как в windows, но вместо react-native буду использовать просто react, а десктоп получим через electron.

Код приложения можно найти тут 👈

GitHub - G28XYZ/start-window-electron

В подробностях рассказывать не буду, в описании на репозитории проекта есть гайд как запустить приложение. Кода там немного, пару часов хватит чтобы понять что к чему, ну и я ниже покажу на что обратить внимание.

Запуск

Есть такой инструмент для electron, electron-forge.

Getting Started | Electron Forge

Он предоставляет готовый шаблон для разработки, а это уже пол дела ! 😁
Запускается все просто:

npx create-electron-app@latest my-app --template=vite-typescript

вместо my-app - любое ваше название приложения

так же есть и другие шаблоны:

  • webpack
  • webpack-typescript
  • vite
  • vite-typescript

Мне интерес vite-typescript.

В шаблоне ни много ни мало файлов и конфигов, но на самом деле не все так страшно как на первый взгляд может показаться.

Конфиги после create-electron-app
Конфиги после create-electron-app

После этого можно запустить npm start и появиться окно приложения.

Запущенное приложения. DevTools открыт т.к. в main прописан вызов этого инструмента.
Запущенное приложения. DevTools открыт т.к. в main прописан вызов этого инструмента.

📁 src

🔹 main.ts

Главный процесс Electron
Создаёт окно (BrowserWindow), запускает приложение. Это точка входа backend-части Electron. Здесь происходит настройка
preload.ts и загрузка index.html

В моем случае, в main.ts почти тоже самое, только добавил больше обработчиков, для рендера второго окна - скрытие/открытие, и http запросы к сайтам за инфой через прокси SOCKS5 (обход блокировки, не все сайты были доступны)
start-window-electron/src/main.ts at main · G28XYZ/start-window-electron

🔹 preload.ts

Preload-скрипт (мост между main и renderer)
Выполняется в контексте окна
до загрузки рендерера. Используется для безопасной передачи API из main-процесса в renderer через contextBridge и ipcRenderer.

В моем случае два окна и два preloads получилось, можно и через один, но решил разделить. И поместил все в каталог preloads. Ключевой момент этих скриптов, определить апи для взаимодействия с backend-electron (см. electronAPI), и определить переменные например windowType, для определения типа окна для рендера.
start-window-electron/src/preloads at main · G28XYZ/start-window-electron

🔹 renderer.ts

Точка входа для фронтенда (рендерер)
Запускается в браузерном контексте внутри окна. Именно сюда компилируется Vite + TypeScript, а дальше можно использовать React или JS

Этот скрипт уже попадает в index.html и отрисовывает UI. В нём ( renderer.ts ) нужно импортировать файлы с компонентами, vite их скопмилирует и корректно все отдаст локальному веб-серверу.
start-window-electron/src/renderer.ts at main · G28XYZ/start-window-electron

🛠 Конфигурация и мета-файлы

🔹 forge.config.ts

Конфигурация Electron Forge
Указывает, как собирать, упаковывать и распространять приложение. Например, сборка .exe, .dmg и т.п.

Шаблон уже предоставляет рабочий конфиг, в нём по мере добавления других preloads нужно дополнять в VitePlugin соответсвенно. Так же в зависимости от задач/требований в packagerConfig можно донастроить приложение. Для примера я добавил иконку приложения.
start-window-electron/forge.config.ts at main · G28XYZ/start-window-electron

🔹 forge.env.d.ts

Типизация для переменных окружения Forge
Содержит декларации типов TypeScript, чтобы IDE понимала, что доступно в среде.

Этот файл не трогал, но в нём скорее всего можно задать глобальные переменные и функции, я их определил в globals.d.ts. Эти файлы больше нужны для typescript типизации.

🔹 index.html

HTML-файл, загружаемый в окно Electron. Он используется Vite как базовый шаблон и подключает скомпилированный JS-файл из renderer.ts.

⚙️ Vite-конфигурации

🔹 vite.main.config.ts

Vite-конфигурация для сборки main-процесса Electron.

🔹 vite.preload.config.ts

Vite-конфигурация для сборки preload-скрипта, выполняемого в изолированном контексте.

🔹 vite.renderer.config.ts

Vite-конфигурация для сборки рендерера (фронтенда). Тут подключаются плагины для React

Так как использую React, для vite нужен плагин чтобы отрисовать react-компоненты, что и нужно указать именно в этом конфиге. В остальных ничего не трогал.

📁 App

Каталог src/app находится реакт-приложение, в index.tsx рендерится окно в зависимости от windowType, эта переменная определяется в preloads, выше о этом говорил.

start-window-electron/src/app/index.tsx at main · G28XYZ/start-window-electron

Описание про реакт компоненты опущу, там может быть все что угодно, но в данном примере достаточно было нескольких небольших компонентов.

Весь список компонентов используемых в приложении.
Весь список компонентов используемых в приложении.

Скрипт для сборки приложения npm run make
Для публикации, например в гит репозитории - npm run publish

Заключение

Минусы приложения на electron - большой размер, потребление ресурсов, безопасность. Это сразу заметно если запустить сборку (npm run make) и посмотреть во что это все превратится. Для небольших приложений, думаю, этим можно пользоваться, или когда нужны решения для рендера веб-приложения в отдельном изолированном окне.
Спасибо за внимание ! 🙂

Версия для windows 👈
Версия для
macos silicon 👈
github с исходным кодом приложения:

GitHub - G28XYZ/start-window-electron

Подписывайтесь на мой телеграм-канал - БлогНот