electron
一、初始化一个 electron 项目
1.先创建一个 package.json 文件
npm init -y
2.下载安装 electron
- 注意要切换淘宝镜像下载
npm instsll electron -S
3.在 package.json 下配置执行脚本
"scripts": {
"start": "nodemon --exec electron . --watch ./ --ext .html,.js,.css"
},
4.在根目录下创建 main.js 文件
const { app, BrowserWindow } = require("electron");
const createWindow = () => {
const win = new BrowserWindow({
width: 1400,
height: 800,
minHeight: 300,
minWidth: 400,
show: true,
movable: true,
backgroundColor: "aliceblue",
});
win.webContents.openDevTools();
win.loadFile("./render/index.html");
win.once("ready-to-show", () => {
win.show();
});
};
app.on("window-all-closed", () => {
console.log("window-all-closed");
if (process.platform !== "darwin") {
app.quit();
}
});
app.whenReady().then(() => {
createWindow();
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
});
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
5.在根目录下创建文件夹 render 里面创建入口文件 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>第一个 electron 项目</h1>
</body>
</html>
二、主进程和渲染进程通信
--根目录
--controller 封装的主线程收发数据
--ipcMessage.js
--preload contextBridge 方法,主线程和渲染线程沟通的桥梁
--index.js
--render 加载的页面入口
--app.js
--index.html
--style.css
--vue.global.js vue的项目包,本示例页面使用 vue3
--main.js 项目入口
1.通信之前需要有 contextBridge 作为主线程和渲染现场之间沟通的桥梁
- 使用
contextBridge 方法,将主线程的信息发送到渲染线程
const { contextBridge } = require("electron");
contextBridge.exposeInMainWorld("myAPI", {
versions: process.versions,
});
const versions = window.myAPI.versions;
2.渲染进程向主进程发送同步信息
- 渲染进程使用方法
ipcRenderer.send('事件名','信息') 发送消息,此操作在 contextBridge 中 - 主线程使用方法
ipcMain 接收,使用方法 event.sender.send 返回内容
const sendSync = (message) => {
ipcRenderer.send("sync-send-event", message);
};
contextBridge.exposeInMainWorld("myAPI", {
sendSync,
});
myAPI.sendSync("from renderer message 1");
ipcMain.on("sync-send-event", (event, msg) => {
event.sender.send("sync-receive-event", "我已经收到:" + msg);
});
contextBridge 接收消息,并将方法抛出到渲染线程,渲染线程创建事件监听
const recieveSyncMsg = () => {
return new Promise((resolve) => {
ipcRenderer.on("sync-receive-event", (event, msg) => {
resolve(msg);
});
});
};
contextBridge.exposeInMainWorld("myAPI", {
recieveSyncMsg,
});
async mounted(){
const result = await myAPI.recieveSyncMsg();
}
以上是一套完整的渲染线程发送数据 -> 主线程接受数据并返回 -> 渲染线程接收返回数据 的过程
3.渲染进程向主进程发送异步消息
- 渲染线程发送数据使用
ipcRenderer.invoke 方法,发送数据的方法在 contextBridge 中使用,同样将方法抛出到渲染线程的 js 文件调用 - 主线程接受数据使用方法
ipcMain.handle
const sendAsync = async () => {
const result = await ipcRenderer.invoke("my-invokable-ipc");
return result;
};
contextBridge.exposeInMainWorld("myAPI", {
sendAsync,
});
async sendAsyncMsg() {
const result = await myAPI.sendAsync()
console.log(result)
}
ipcMain.handle('my-invokable-ipc', async (event, ...args) => {
const result = await somePromise()
return result
})
function somePromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('message from main process.')
}, 3000)
})
}
|