Я использую электрон уже некоторое время. Как самый мощный инструмент упаковки для межтерминальных приложений, я глубоко впечатлен его простотой и удобством использования. Раньше это была простая конфигурация из коробки. Недавно проект больше потребностей, и я выкопал больше API, в основном в том числе:
- Как отличить систему от упаковки стороннего ПО и запуска его в подпроцессе?
- Как оптимизировать размер упаковки электрона?
Давайте сначала перейдем в каталог проекта, чтобы облегчить описание позже
.
├── app // 生产package.json
│ ├── package.json
│ └── yarn.lock
├── build // 第三方资源
│ ├── macResources
│ └── winResources
├── dist // 打包的应用的储存处
├── electron-builder.yml // 配置文件
├── icon.icns // Mac的 icon
├── icon.ico // Win 的 icon
├── main.js // 主程序
├── package.json // 开发 package.json
├── to-build // 前端资源页面
│ ├── index.bundle.js
│ ├── index.html
├── webpack.config.js // 打包 main.js 的 webpack 配置
└── yarn.lock
Разбейте первую задачу:
- Система дифференциации
В Electron есть несколько макропеременных, которые можно использовать непосредственно в файле, см.File Macros, Все что мне нужно это
${os}
, если они вас не удовлетворяют, вы можете использоватьenv.ENV_NAME
Определите его самостоятельно. Необходимо использоватьcross-envГарантированно кроссплатформенный
cross-env CUSTOMER_ENV=anything electron-builder
- Как упаковать стороннее программное обеспечение Следует отметить, что электрон по умолчанию обнаружит все файлы, кроме папки сборки, если она соответствует заданным параметрам.file-pattern, он будет упакован. Требуется упаковать различное стороннее программное обеспечение (например, драйверы) в соответствии с различными системами. Я использую следующий метод:
- Сотрудничать
${os}
значение для имени папки,macResources/winResources
, вы можете легко использовать переменную макроса "${os}Resources", чтобы найти соответствующую папку - Поместите оба в папку сборки (так ничего не будет упаковано)
- Есть несколько способов упаковки
- определение
file
- определение
extraResources
- определение
extraFiles
(Единственное отличие от первого в том, что первый не копируется вcontent
середина,видеть) В итоге я использовал конфигурациюfile
, потому чтоfile
будет сmain
В каталоге такого же уровня проще понять поиск пути командной строки после меня (extraResources
Будет вResource
Этот каталог требует../
на предыдущий уровень)
- определение
Обратите внимание, что определеноfile
Поле также означает, что значение по умолчанию недействительно, и вам нужно вручную включить их все.И это должна быть папка или включать подстановочные знаки (используйте имя файла напрямую, чтобы попытаться включить недействительное)
Также обратите внимание, что если это исполняемый файл, его нельзя использовать.asar
Метод сжатия, необходимо установить:asar: false
.Использование 2,3 не имеет этого ограничения (ведь оно в родительской папке, там реальный путь, не сожмется), после сравнения не используетсяasar
, объем приложения не сильно отличается, и безопасности нет, его можно легко распаковать,Ссылаться на, Конечно, вы также можете использоватьasarUnpack
поле для настройки конфигурации.Может относиться к
Следующим шагом является то, как заставить стороннее программное обеспечение выполняться вместе с приложением.main.js
используется вchild-process
модульныйspawn
, Просто перейдите по соответствующему пути. Это не относится к области электрона, это относится к nodejsAPI .
let childSpawn;
const checkMacOS = () => os.platform() === 'darwin';
if (checkMacOS()) {
childSpawn = spawn(path.join(__dirname, 'macResources/xxx'));
} else {
spawn(path.join(__dirname, './winResources/xxx'));
}
использоватьspawn
Это связано с тем, что стороннее программное обеспечение необходимо завершить одновременно с закрытием программного обеспечения.win
может быть прекращено автоматически,mac
Необходимо указатьpid
mainWindow.on('closed', function() {
if (checkMacOS()) {
process.kill(childSpawn.pid);
}
mainWindow = null
})
На самом деле объем этого пакета намного меньше, чем если бы я упаковывал его без различия платформы (две платформы будут упакованы без различия платформы). упакованный контентnode_module
На него тоже приходится десятки мегабайт, и толку от него никакогоelectron
а такжеelectron-builder
... Нет, я должен найти способ удалить его.
Его определенно невозможно удалить напрямую, потому чтоmain.js
многое другоеrequire
Что. Итак, первый шаг — использоватьwebpack
Для упаковки и подключения зависимостей следует отметить, чтоtarget
Установить какelectron-main
Как включить после упаковкиmain.js
Есть два варианта
- использовать предыдущий
files
поле, будетwebpack
Послеmain.js
Включено. Здесь можно использовать подстановочные знаки и другие методы, поэтому я не буду вдаваться в подробности. - использоватьдвойной пакет.json, это немного интересно, нужно развивать
package.json
, один производственныйpackage.json
И похоже, что структура проекта стала чище, так что попробуйте. Конкретная операция – это - создать новый
app
папка, по умолчанию будет корневым каталогом пакета, поэтому в файле конфигурацииfiles
Используемый относительный путь необходимо соответствующим образом изменить. - существует
app
создать новыйpackage.json
, просто включитеname, version, description
и другую простую информацию, а если есть не-js-зависимости, такие как вызовC++
Библиотека, она нужна здесьdependencies
Добавлено. Я им не пользовался, так что пока не обращайте на него внимания.
Ниже приведеныwebpack
Конфигурация, поскольку сам электрон является ядром хрома, не требует совместимости, поэтому не вводитсяbabel
const path = require('path');
module.exports = {
target: 'electron-main',
entry: path.resolve(__dirname, 'main.js'),
output: {
path: path.resolve(__dirname, 'app'),
filename: '[name].js'
},
mode: 'production',
node: {
// 使用绝对路径
__dirname: false,
}
};
Ниже приведено электронноеyml
конфигурация для справки
directories:
output: ./dist
appId: com.electron.xxx
asar: false
copyright: xxx
productName: xxx
mac:
target:
- dmg
icon: ./icon.icns
dmg:
contents:
- x: 130
'y': 50
type: dir
name: Driver
path: build/macResources/Driver
- x: 130
'y': 210
- x: 400
'y': 210
type: link
path: /Applications
nsis:
allowToChangeInstallationDirectory: true
oneClick: false
menuCategory: true
include: build/installer.nsh
allowElevation: true
perMachine: true
win:
target: nsis
files:
- from: ../build/${os}Resources/
to: ${os}Resources/
- from: ./
to: ./
- from: ../to-build
to: web
compression: normal
electronVersion: 6.0.9
Поговорим о результатах, ведь сторонний софт загружается по требованию, что сокращается вдвоеresource
Размер, т.к. удаленnode_modules
, использоватьwebpack
После uglify стало на десятки мегабайт меньше.Поскольку у меня сторонний софт относительно большой, то общее сокращение составляет более 400 М. Плюс конфигурацияcompression: normal
, После сжатия объем установочного пакета контролируется в пределах 150M, что соответствует требованиям продукта.