В этом руководстве мы создадим кроссплатформенное настольное приложение с использованием 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.htmldist  Этот пример кода адаптирован из официального начального репозитория . 
  Затем откройте файл package.jsonmainmain.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:electronng 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-demodist 
  В нашем файле main.jsindex.htmldist 
        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.htmldist 
  Откройте файл angular.jsonprojects → architect → build → options → outputPathdist/electron-angular-demodist 
       "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 builddistelectron 
Это скриншот нашего настольного приложения под управлением 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.jsipcMain 
     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 
  Затем прослушайте сообщение openModalopenModal() 
     ipcMain.on('openModal', (event, arg) => {
      openModal()
    })
  Теперь откройте файл src/app/app.component.ts 
 import { IpcRenderer } from 'electron';
  Затем определите переменную ipcrequire('electron').ipcRendereripcRenderer 
       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()ipcRendereropenModal 
  Откройте файл src/app/app.component.htmlopenModal() 
     <button (click)="openModal()">
      Open Modal
    </button>
Теперь запустите ваше настольное приложение, используя следующую команду:
 npm run start:electron
Это скриншот основного окна с кнопкой:
Если вы нажмете кнопку « Открыть модальное окно», откроется модальное окно с веб-сайтом SitePoint:
Вы можете найти исходный код этой демонстрации в репозитории GitHub .
Вывод
В этом руководстве мы рассмотрели, как запустить веб-приложение, созданное на Angular, в качестве настольного приложения с использованием Electron. Мы надеемся, что вы узнали, как легко начать создавать настольные приложения с помощью набора инструментов для веб-разработки!


