electron打包软件包示例
Posted HeavyShell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了electron打包软件包示例相关的知识,希望对你有一定的参考价值。
公司最近产品需求变更,具体到项目要求如下:
1、原本的web浏览器访问URL平台形式不再提供
2、转化为软件包形式提供给客户安装,原url关闭
项目实施:
1、采用electron打包软件盒子形式
2、因url关闭,单提供api服务可调用,故须采用loadFile方法集成,而非loadURL
本文主要介绍使用electron打包软件的逻辑和配置:
1、原项目是umiJS项目,直接使用编译后的文件:./dist目录,如图:
2 拷贝./dist目录至,electron项目目录,electron目录结构如图:
3、其中assets目录存放软件安装时的icon图标
4、给出package.json、main.js、preload.js(payload.js为可选文件,根据自己项目可选择使用)
(1)package.json
{
"name": "electron-react",
"version": "1.0.0",
"main": "main.js",
"homepage": "http://blog.ixiewei.com",
"author": {
"name": "Heavy",
"email":""
},
"description": "electron-react",
"scripts": {
"pack": "electron-packager . cloudit --out ./pack --ignore=node_modules --overwrite --icon=./assets/fav256.ico",
"build": "electron-builder"
},
"devDependencies": {
"electron": "^6.0.0",
"electron-packager": "^14.0.4",
"electron-builder": "^22.10.5"
},
"build": {
"productName": "electron-react",
"appId": "ssc appId",
"copyright": "Heavy",
"directories": {
"output": "build"
},
"win": {
"artifactName": "electron-react-client.${ext}",
"icon": "./assets/fav256.ico",
"target": ["nsis"]
},
"mac": {
"artifactName": "electron-react-client.${ext}",
"icon": "./assets/fav512.icns",
"target": ["dmg","zip"]
},
"linux": {
"artifactName": "electron-react-client.${ext}",
"icon": "./assets/fav.png",
"target": ["AppImage"],
"category": "Education"
},
"files":[
"dist/**/*",
"main.js",
"preload.js"
]
},
"license": "MIT"
}
(2)main.js
const electron = require('electron');
var path = require("path");
// 控制应用生命周期的模块
const {app} = electron;
// 创建本地浏览器窗口的模块
const {BrowserWindow,Menu,globalShortcut,ipcMain} = electron;
// 指向窗口对象的一个全局引用,如果没有这个引用,那么当该javascript对象被垃圾回收的时候该窗口将会自动关闭
let win;
function createWindow() {
// 隐藏菜单栏
Menu.setApplicationMenu(null)
// 创建一个新的浏览器窗口
win = new BrowserWindow({
width: 1200,
height: 700,
title: 'Loading...',
show: false,
icon: path.join(__dirname, './assets/fav256.ico'),
webPreferences: {
// webSecurity: false,
contextIsolation:false,
preload: path.join(__dirname, 'preload.js')
}
});
// 并且装载应用URL
win.loadFile(path.join(__dirname, './dist/index.html'));
// win.webContents.on('did-finish-load',() => {
// win.webContents.send('msgFromMain-init', {type:'did-finish-load',content:'渲染进程的页面加载完成'});
// })
win.once('ready-to-show', () => {
win.show();
// 监听F5刷新
// globalShortcut.register('f5', function() {
// console.log('f5 is pressed')
// win.webContents.send('msgFromMain-f5', {type:'f5',content:'F5键按下'});
// });
});
// 打开开发工具页面
// win.webContents.openDevTools();
// 当窗口关闭时调用的方法
win.on('closed', () => {
// 监听F5刷新
// globalShortcut.unregister('f5');
// 解除窗口对象的引用,通常而言如果应用支持多个窗口的话,你会在一个数组里
// 存放窗口对象,在窗口关闭的时候应当删除相应的元素。
win = null;
});
}
// 监听渲染进程发给主进程的消息
// ipcMain.on('msgToMain-logout', (event, args) => {
// console.log(args)
// });
// 当Electron完成初始化并且已经创建了浏览器窗口,则该方法将会被调用。
// 有些API只能在该事件发生后才能被使用。
app.on('ready', createWindow);
// 当所有的窗口被关闭后退出应用
app.on('window-all-closed', () => {
// 对于OS X系统,应用和相应的菜单栏会一直激活直到用户通过Cmd + Q显式退出
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
// 对于OS X系统,当dock图标被点击后会重新创建一个app窗口,并且不会有其他
// 窗口打开
if (win === null) {
createWindow();
}
});
// SSL/TSL: this is the self signed certificate support
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
// On certificate error we disable default behaviour (stop loading the page)
// and we then say "it is all fine - true" to the callback
event.preventDefault();
callback(true);
});
// 在这个文件后面你可以直接包含你应用特定的由主进程运行的代码。
// 也可以把这些代码放在另一个文件中然后在这里导入。
(3)preload.js
const { contextBridge, ipcRenderer } = require('electron')
var path = require("path");
var API_URL="http://192.168.12.12:9000"; //服务侧api
window.ELECTRON={
env:true,
apiUrl:API_URL,
pathJoin:function(file){
return path.join(__dirname, file)
},
sendMessage: (channel, data) => {
let validChannels = ['msgToMain-logout'];
if (validChannels.includes(channel)) {
// ipcRenderer 渲染进程向主进程发送请求。
ipcRenderer.send(channel, data);
}
},
receiveMessage:(channel, func) => {
let validChannels = ['msgFromMain-init','msgFromMain-f5'];
if (validChannels.includes(channel)) {
// 渲染进程通过 channel 名调用接收方法,从主进程拿到响应内容,再用自己的方法进行处理。
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
};
// contextBridge.exposeInMainWorld('electron', {
// env: true, //处于electron环境中
// })
5、编译执行
(1)执行yarn run build,生成目录build
(2)在./build目录中,可见已打包好的软件安装包
(3)双击软件包安装(windows环境下),其他环境类似,文件具体格式按package.json中配置走
6、注意点
electron-builder的使用,配置中files须指定要打包的目录文件
"files":[
"dist/**/*",
"main.js",
"preload.js"
]
推荐部分学习参考资料:
https://www.freesion.com/article/4337116608/
http://www.makaiqian.com/jie-jue-electronyu-jian-not-allowed-to-load-local-resource/
https://github.com/electron-react-boilerplate/electron-react-boilerplate/blob/main/src/main/main.ts
https://zhuanlan.zhihu.com/p/376082990
https://gitee.com/llj_8098/basic-electron-umi-app/blob/master/app/main.js
http://www.electronjs.org/zh/docs/latest/tutorial/process-model
https://www.cnblogs.com/seesawgame/p/14592534.html
https://www.cnblogs.com/makalochen/p/14472976.html
以上是关于electron打包软件包示例的主要内容,如果未能解决你的问题,请参考以下文章