Если вы хотите попробовать Electron, давайте взглянем на этот обзор пит-лазания.

внешний интерфейс Electron

предисловие

Есть много вещей, которые может сделать Интернет, но когда дело доходит до операционных систем, он может быть немного ошеломляющим. Когда я разрабатывал веб-систему некоторое время назад, я столкнулся с похожей ситуацией. Нам нужно получить некоторую информацию об операционной системе компьютера, например, mac-адрес и т. д. Наша веб-система полностью размещена на сервере и работает через браузер, но желаемый эффект не может быть достигнут напрямую через веб-часть.

Проблемы оставляют решать людям. После обсуждений среди коллег, т.к. сама система не сложная и требует быстрой разработки. Решил использовать Electron + страницы оригинальной веб-системы для решения проблем, связанных с информацией об операционной системе.

В этой статье описаны некоторые проблемы и решения, с которыми я столкнулся при использовании Electron.

Что такое Электрон?

Создавайте кроссплатформенные настольные приложения с помощью JavaScript, HTML и CSS — здесьElectronЗнакомство с официальным сайтом

Electron — это фреймворк с открытым исходным кодом, разработанный GitHub. Это позволяет разрабатывать настольные приложения с графическим интерфейсом, используя Node.js (в качестве серверной части) и Chromium (в качестве внешнего интерфейса). В настоящее время Electron используется для разработки внешнего и внутреннего интерфейса несколькими веб-приложениями с открытым исходным кодом, известными проектами, включая Atom GitHub и Visual Studio Code от Microsoft. --Знаю почти

Можно просто понять, что Electron ставит на веб-проект оболочку среды Node.js, чтобы мы могли вызывать богатый API Node.js. Таким образом, мы можем использовать JavaScript для написания настольных приложений, расширяя многие возможности, которые мы не можем делать в Интернете.

Как создавать приложения Electron?

Создавать приложения Electron очень просто, либо изучив официальную документацию, либо используя существующие колеса. В основном его можно разделить на две категории: шаблоны и инструменты командной строки. Оба метода имеют свои преимущества, и какой метод выбрать, зависит от вашей реальной ситуации. Возьмите меня в качестве примера, потому что у проекта, который я хочу сделать, уже есть веб-страница, и эти шаблоны в основном неприменимы.Чтобы не отставать от прогресса, я буду напрямую ссылаться на официальный сайт для начала——Создайте свое первое электронное приложение, а также исходный код для сборки проекта.

Ниже приведены некоторые часто используемые шаблоны сборки и инструменты командной строки.

шаблон

инструмент командной строки

один пример

Ниже приведен самый простой проект Electron, и последующий код расширяется на его основе.

npm install --save-dev electron

общая структура

demo/
├── package.json
├── main.js
└── index.html

package.json

{
  "name": "demo",
  "version": "1.0.0",
  "description": "electornDemo",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "xmanlin",
  "license": "MIT",
  "devDependencies": {
    "electron": "^9.0.0"
  }
}

main.js

const {app, BrowserWindow} = require('electron')

app.on('ready', function createWindow () {
    // 可以创建多个渲染进程
    let win = new BrowserWindow({
        width: 800,
        height: 600,
    })
    
    win.show()

    // 渲染进程中的web页面可以加载本地文件
    win.loadFile('index.html')


    // 记得在页面被关闭后清除该变量,防止内存泄漏
    win.on('closed', function () {
        win = null
    })


})

// 页面全部关闭后关闭主进程,不同平台可能有不同的处理方式
app.on('window-all-closed', () => {
    app.quit()
})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>demo</title>
</head>
<body>
    <div>一个electron项目</div>
    <script>
    
    </script>
</body>
</html>

Каковы основной процесс и процесс рендеринга?

В Electron концепции основного процесса и процесса рендеринга очень важны.Подробности см. во введении на официальном сайте:Основной процесс и процесс рендеринга.

основной процесс

  • бегатьpackage.jsonсерединаmainПроцесс сценария является основным процессом.
  • Электронное приложение имеет один и только один основной процесс.
  • Основной процесс может выполнять собственные операции API, связанные с графическим интерфейсом.

процесс рендеринга

  • Electron использует Chromium для отображения веб-страниц, поэтому также используется многопроцессорная архитектура Chromium.
  • Каждая веб-страница работает в своем собственном процессе рендеринга.
  • использоватьBrowserWindowКласс запускает процесс рендеринга и запускает экземпляр в этом процессе, когдаBrowserWindowПосле уничтожения экземпляра соответствующий процесс рендеринга также прекращается.
  • Собственные ресурсы нельзя вызывать в процессе рендеринга, но процесс рендеринга также содержит среду Node.js, поэтому Node.js можно внедрить. Модули при поддержке Node.js могут выполнять некоторые низкоуровневые взаимодействия с операционной системой на странице.

Как вызвать Node.js API в процессе рендеринга?

После версии Electron 5.0 процесс рендеринга по умолчанию не может вызывать API Node.js, его можно установить только после настройки:

Основной процесс (main.js)

let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
        nodeIntegration: true,  //设置为true就可以在这个渲染进程中调用Node.js
    }
})

Как открыть инструменты разработчика?

Хотя Electron использует Chromium, он не похож на браузер, чтобы открывать инструменты разработчика, такие как нажатие F12 по умолчанию в Windows.

Есть два способа открыть инструменты разработчика в Electron:

Первый — установить его в основном процессе.После настройки запустите проект, и процесс рендеринга по умолчанию откроет инструменты разработчика.

 win.webContents.openDevTools();

Второй вариант — выбрать View -> Toggle Developer Tools в строке меню окна процесса рендерера. (Или просто следуйте сочетаниям клавиш выше)

Электронная консоль печатает искаженные символы?

У нас может быть проблема искаженных китайских символов в консоли Windows.Когда мы вводим chcp в консоли Windows, мы можем просмотреть текущую кодировку символов.Общее значение gb2312 — 936, а значение utf8 — 65001. Только в этом случаеpackage.jsonНастройка исправит.

"start": "chcp 65001 && electron ."

Как наладить связь между основным процессом и процессом рендерера?

Между основным процессом и процессом рендеринга может проходитьipcRendererиipcMainсвязь модуля.

Основной процесс активно отправляет сообщение процессу рендеринга.

Основной процесс (main.js)

//主进程向渲染进程发送消息,'did-finish-load':当导航完成时发出事件,onload 事件也完成
win.webContents.on('did-finish-load', () => {
    win.webContents.send('msg', '消息来自主进程')
})

Процесс рендеринга (index.html)

<script>
    const {ipcRenderer} = require('electron')
    ipcRenderer.on('msg', (event, message) => {
        console.log(message) // 消息来自主进程
    })
</script>

Процесс рендеринга активно отправляет сообщение основному процессу

Процесс рендеринга (index.html)

const {ipcRenderer} = require('electron')
ipcRenderer.send('indexMsg','消息来自渲染进程')

Основной процесс (main.js)

const {ipcMain} = require('electron')
ipcMain.on('indexMsg',(event,msg) => {
    console.log(msg) //消息来自渲染进程
})

Как взаимодействуют процессы рендеринга?

Существует множество способов взаимодействия между процессами рендеринга, и перечислены следующие:

Использовать глобальные общие свойства

//主进程
global.sharedObject = {
  user: ''
}

//渲染进程一
const {remote} = require('electron')
remote.getGlobal('sharedObject').user = 'xmanlin'

//渲染进程二
const {remote} = require('electron')
console.log(remote.getGlobal('sharedObject').user) //xmanlin

ipcRenderer.sendTo()

НижеipcRenderer.sendTo()параметры

ipcRenderer.sendTo(webContentsId, channel, [, arg1][, arg2][, ...])
ipcRenderer.sendTo(windowId, 'ping', 'someThing')
//webContentsId : Number
//channel : String
//...args : any[]

конкретное использование

Основной процесс (main.js)

//创建一个新的渲染进程
let win2 =  new BrowserWindow({
    width: 800,
    height: 600,
})

//为渲染进程设置唯一id
win2.id = 2

процесс рендеринга 1

<script>
    const {ipcRenderer} = require('electron')
    //向id为2的渲染进程发送消息
    ipcRenderer.sendTo(2,'msg1','来自渲染进程1的消息')
</script>

процесс рендеринга 2

<script>
    const {ipcRenderer} = require('electron')
    ipcRenderer.on('msg1', (event, message) => {
        console.log(message) // 来自渲染进程1的消息
    })
</script>

Использовать основной процесс в качестве станции ретрансляции сообщений

//主进程
ipcMain.on('msg1', (event, message) => {
  yourWindow.webContents.send('msg2', message);
}

//渲染进程1
ipcRenderer.send('msg1', '来自渲染进程1的消息')

//渲染进程2
ipcRenderer.on('msg2', (event, message) => {
    console.log(message)  //来自渲染进程1的消息
  }
)

Как упаковать проект?

Упаковка также является важным шагом.Вот еще два зрелых упаковочных инструмента:electron-packagerиelectron-builder. Эти два инструмента в основном настраивают его.

electron-packager

Мы можем использовать electronic-packager для упаковки нашего существующего электронного приложения в исполняемый файл.

Установить первым

npm install electron-packager --save-dev

После установки вам необходимо настроить основные команды electronic-packager.В официальной документации представлен основной формат:

electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> [optional flags...]

Кратко представим значение каждого параметра:

  • sourcedir: путь, по которому находится проект
  • appname: имя приложения (имя упакованного файла)
  • платформа: определяет, на какой платформе вы хотите создать приложение (Windows, Mac или Linux).
    • platform=win32от имени Windows
    • platform=darwinдля Mac
    • platform=linuxрасшифровывается как линукс
  • arch: определяет, использовать ли x86 или x64 или обе архитектуры
  • дополнительные опции: дополнительные опции

Ниже приведен пример для справки

package.json

"scripts": {
    "build32": "electron-packager ./ appDemo --platform=win32 --arch=ia32  --out=./app --app-version=1.0.0 --overwrite --icon=./favicon.ico",
    "build64": "electron-packager ./ appDemo --platform=win32 --arch=x64  --out=./app --app-version=1.0.0 --overwrite --icon=./favicon.ico"
  }

Вышеупомянутое все упакованное программное обеспечение под Windows, build32 упакован как 32-битный, а build64 упакован как 64-битный. В дополнение к основным параметрам значения других параметров, указанных выше, следующие:

  • --out указывает каталог файлов, сгенерированных после упаковки
  • --app-version указывает номер версии упакованного сгенерированного файла
  • --overwrite означает удаление исходного файла пакета и создание нового файла пакета.
  • --icon представляет значок упакованного файла

electron-builder

Электрон-билдер может быть упакован не только в виде исполняемых файлов, но и в виде устанавливаемых программ, и его функции также богаче, чем у электрона-упаковщика.

Официальный сайт предпочитает пряжу для установки

yarn add electron-builder --dev

Конечно, npm также возможен

npm install electron-builder --save-dev

Затем мы можем настроить

"scripts": {
  "pack": "electron-builder --dir",
  "dist": "electron-builder"
},
 "build": {
   "productName": "appDemo", // app中文名称
   "appId": "appDemoId",// app标识
   "directories": { // 打包后输出的文件夹
     "buildResources": "resources",
     "output": "dist/"
   }
   "files": [ // 打包后依然保留的源文件
     "dist/electron",
     "node_modules/",
     "package.json"
   ],
   "mac": { // mac打包配置
     "target": "dmg",
     "icon": "icon.ico"
   },
   "win": { // windows打包配置
     "target": "nsis",
     "icon": "icon.ico"
   },
   "dmg": { // dmg文件打包配置
     "artifactName": "appDemo.dmg",
     "contents": [
       {
         "type": "link",
         "path": "/Applications",
         "x": 410,
         "y": 150
       },
       {
         "type": "file",
         "x": 130,
         "y": 150
       }
     ]
   },
   "nsis": { // nsis文件打包配置
     "oneClick": false,
     "allowToChangeInstallationDirectory": true, // 允许修改安装目录
     "allowElevation": true, // 允许请求提升。 如果为false,则用户必须使用提升的权限重新启动安装程序。
     "installerIcon": "./build/icons/aaa.ico",// 安装图标
     "uninstallerIcon": "./build/icons/bbb.ico",//卸载图标
     "installerHeaderIcon": "./build/icons/aaa.ico", // 安装时头部图标
     "createDesktopShortcut": true, // 创建桌面图标
     "createStartMenuShortcut": true,// 创建开始菜单图标
     "shortcutName": "xxxx", // 图标名称
     "include": "build/script/installer.nsh", //包含的自定义nsis脚本这个对于构建需求严格得安装过程相当有用。
   },
 }

При упаковке с электрон-билдером вы также можете указать параметры

 --mac, -m, -o, --macos   macOS打包
 --linux, -l              Linux打包
 --win, -w, --windows     Windows打包
 --mwl                    同时为macOS,Windows和Linux打包
 --x64                    x64 (64位安装包)
 --ia32                   ia32(32位安装包) 

Все параметры могут относиться кCommand Line Interface (CLI)

Что касается NSIS, вы также можете узнать об этом методе упаковки:процесс электронной упаковки электронный упаковщик + NSIS

Как установить окно по умолчанию развернутым и полноэкранным?

Развернуть по умолчанию

//主进程(main.js)
let win = new BrowserWindow({show: false})
win.maximize()
win.show()

полноэкранный режим по умолчанию

//主进程(main.js)
let win = new BrowserWindow({fullscreen: true})

Как настроить панель меню?

Вы можете напрямую ссылаться на эту статью-Настройка меню с помощью Electron, написанное более подробно, также можно напрямую обратиться к официальной документации. Конечно, мы также можем скрыть встроенную строку меню, а затем вызвать API написания Electron, чтобы написать строку меню. Например, VSCode делает это, откройте VSCode, а затем найдите в справке переключатель инструментов разработчика, вы можете найти новый мир~.

Как получить mac-адрес операционной системы?

В основном это вызов API Node.js для получения mac-адреса системы.

var os=require("os");
//获取mac地址
var mac = ''
var networkInterfaces=os.networkInterfaces();
for(var i in networkInterfaces){
    for(var j in networkInterfaces[i]){
        if(networkInterfaces[i][j]["family"]==="IPv4" && networkInterfaces[i][j]["mac"]!=="00:00:00:00:00:00" && networkInterfaces[i][j]["address"]!=="127.0.0.1"){
            mac = networkInterfaces[i][j]["mac"]
        }
    }
}

Ссылаться на

www.electronjs.org/docs

blog.CSDN.net/WeChat_4276…

woohoo.brief.com/afraid/62 упаковки от 45Ed…

blog.CSDN.net/QQ_34803821…

сегмент fault.com/ah/119000001…

nuggets.capable/post/684490…

Наконец

В этой статье описаны проблемы, с которыми я столкнулся при изучении и применении Electron, а также решения, которые я нашел, и я надеюсь, что она будет полезна для всех. Если есть какие-либо недостатки или ошибки, пожалуйста, укажите на них ~