В этом руководстве мы создадим кроссплатформенное настольное приложение с использованием Electron и веб-технологий, таких как TypeScript и Angular.
Electron.js — это популярная платформа для создания кроссплатформенных настольных приложений для Windows, Linux и macOS с JavaScript, HTML и CSS. Он создан и поддерживается GitHub и доступен под разрешающей лицензией MIT. Первоначально он был создан для редактора Atom в GitHub, но с тех пор использовался для создания приложений такими компаниями, как Microsoft ( код Visual Studio ), Facebook, Slack и Docker.
Electron использует мощные платформы, такие как Google Chromium и Node.js, но также предоставляет собственный набор богатых API для взаимодействия с базовой операционной системой.
Electron предоставляет собственный контейнер, который оборачивает веб-приложения, чтобы они выглядели и выглядели как настольные приложения с доступом к функциям операционной системы (аналогично Cordova для мобильных приложений). Это означает, что мы можем использовать любую библиотеку JavaScript или фреймворк для создания нашего приложения. В этом уроке мы будем использовать Angular.
Предпосылки
Для этого урока вам понадобятся следующие условия:
- Знакомство с TypeScript и Angular.
- Node.js и npm установлены на вашем компьютере разработчика.
Установка углового CLI
Давайте начнем с установки Angular CLI, который является официальным инструментом для создания и работы с Angular-проектами. Откройте новый терминал и выполните следующую команду:
npm install -g @angular/cli
Мы установим Angular CLI глобально в нашей системе. Если команда завершается с ошибкой EACCESS , добавьте sudo
Если CLI успешно установлен, перейдите в рабочий каталог и создайте новый проект Angular, используя следующие команды:
cd ~
ng new electron-angular-demo
Подождите, пока файлы вашего проекта будут сгенерированы и зависимости будут установлены из npm. Затем перейдите к корню вашего проекта и выполните следующую команду, чтобы установить последнюю версию Electron из npm в качестве зависимости для разработки:
npm install --save-dev electron@latest
На момент написания данной статьи эта команда установит Electron v4.1.4 .
Затем создайте файл main.js
const {app, BrowserWindow} = require('electron')
const url = require("url");
const path = require("path");
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
mainWindow.loadURL(
url.format({
pathname: path.join(__dirname, `/dist/index.html`),
protocol: "file:",
slashes: true
})
);
// Open the DevTools.
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()
})
Этот код просто создает окно графического интерфейса и загружает файл index.html
dist
Этот пример кода адаптирован из официального начального репозитория .
Затем откройте файл package.json
main
main.js
{
"name": "electron-angular-demo",
"version": "0.0.0",
"main": "main.js",
// [...]
}
Далее нам нужно добавить скрипт, чтобы легко запустить приложение Electron после сборки проекта Angular:
{
"name": "electron-angular-demo",
"version": "0.0.0",
"main": "main.js",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"start:electron": "ng build --base-href ./ && electron ."
},
// [...]
}
Мы добавили start:electron
ng build --base-href ./ && electron .
команда:
- Часть команды
ng build --base-href ./
./
-
electron .
часть команды запускает наше приложение Electron из текущего каталога.
Теперь в вашем терминале выполните следующую команду:
npm run start:electron
Окно Electron GUI будет открыто, но будет пустым. В консоли вы увидите ошибку « Не разрешено загружать локальный ресурс: /electron-angular-demo/dist/index.html» .
Electron не может загрузить файл из папки dist
Если вы загляните в папку вашего проекта, то увидите, что Angular CLI создает ваше приложение в папке dist/electron-angular-demo
dist
В нашем файле main.js
index.html
dist
mainWindow.loadURL(
url.format({
pathname: path.join(__dirname, `/dist/index.html`),
protocol: "file:",
slashes: true
})
);
__dirname
Мы используем метод path.join()
/dist/index.html
Вы можете изменить вторую часть пути на /dist/electron-angular-demo/index.html
dist
Откройте файл angular.json
projects → architect → build → options → outputPath
dist/electron-angular-demo
dist
"projects": {
"electron-angular-demo": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist",
Вернитесь к своему терминалу и снова выполните следующую команду:
npm run start:electron
Сценарий вызовет команду ng build
dist
electron
Это скриншот нашего настольного приложения под управлением Angular:
Вызов Electron API от Angular
Давайте теперь посмотрим, как мы можем вызывать Electron API из Angular.
В приложениях Electron используется основной процесс, на котором выполняется Node.js, и процесс рендеринга, выполняющий браузер Chromium. Мы не можем получить прямой доступ ко всем API-интерфейсам Electron из приложения Angular.
Нам необходимо использовать IPC или межпроцессное взаимодействие , которое представляет собой механизм, предоставляемый операционными системами для обеспечения связи между различными процессами.
Не все API-интерфейсы Electron должны быть доступны из основного процесса. Некоторые API-интерфейсы могут быть доступны из процесса визуализации, а некоторые API-интерфейсы доступны как из основного процесса, так и из процесса визуализации.
BrowserWindow , которое используется для создания и управления окнами браузера, доступно только в основном процессе. API desktopCapturer (используемый для захвата аудио и видео с рабочего стола с помощью API navigator.mediaDevices.getUserMedia
Между тем API буфера обмена (для выполнения операций копирования и вставки в системном буфере обмена) доступен как в основном процессе, так и в процессе визуализации.
Вы можете увидеть полный список API из официальных документов .
Давайте рассмотрим пример вызова API BrowserWindow
Откройте файл main.js
ipcMain
const {app, BrowserWindow, ipcMain} = require('electron')
Затем определите openModal()
function openModal(){
const { BrowserWindow } = require('electron');
let modal = new BrowserWindow({ parent: mainWindow, modal: true, show: false })
modal.loadURL('https://www.sitepoint.com')
modal.once('ready-to-show', () => {
modal.show()
})
}
Этот метод создаст дочернее модальное окно, загрузит внутри него URL-адрес https://www.sitepoint.com
Затем прослушайте сообщение openModal
openModal()
ipcMain.on('openModal', (event, arg) => {
openModal()
})
Теперь откройте файл src/app/app.component.ts
import { IpcRenderer } from 'electron';
Затем определите переменную ipc
require('electron').ipcRenderer
ipcRenderer
private ipc: IpcRenderer
constructor(){
if ((<any>window).require) {
try {
this.ipc = (<any>window).require('electron').ipcRenderer;
} catch (e) {
throw e;
}
} else {
console.warn('App not running inside Electron!');
}
}
Метод require()
Наконец, добавьте следующий openModal()
openModal(){
console.log("Open a modal");
this.ipc.send("openModal");
}
Мы используем метод send()
ipcRenderer
openModal
Откройте файл src/app/app.component.html
openModal()
<button (click)="openModal()">
Open Modal
</button>
Теперь запустите ваше настольное приложение, используя следующую команду:
npm run start:electron
Это скриншот основного окна с кнопкой:
Если вы нажмете кнопку « Открыть модальное окно», откроется модальное окно с веб-сайтом SitePoint:
Вы можете найти исходный код этой демонстрации в репозитории GitHub .
Вывод
В этом руководстве мы рассмотрели, как запустить веб-приложение, созданное на Angular, в качестве настольного приложения с использованием Electron. Мы надеемся, что вы узнали, как легко начать создавать настольные приложения с помощью набора инструментов для веб-разработки!