electron打包软件包示例

14 篇文章 0 订阅
7 篇文章 0 订阅

公司最近产品需求变更,具体到项目要求如下:
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
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值