Electron介绍
- 一款应用广泛的跨平台的桌面应用开发框架
- Electron的本质是结合了Chromium与Node.js
- 使用HTML,CSS,JS等Web技术构建桌面应用程序
Electron流程模型
创建Electron项目
直接npm i electron -D
先安装
主进程->预加载脚本->渲染进程
而预加载脚本是运行在渲染进程上的
进程通信
渲染进程->主进程(单向)
一个简单的需求,在窗口内输入一个字符串,然后将字符串写入到磁盘中
也就是渲染进程传递到主进程,要借助预加载脚本
首先在预加载脚本中写上传递参数的方法
1 2 3 4 5 6 7
| contextBridge.exposeInMainWorld('myAPI', { version: process.versions.electron, saveFile: (data) => { ipcRenderer.send('file-save', data) } })
|
然后在渲染进程中调用
1 2 3
| btn2.onclick = () => { myAPI.saveFile(input.value) }
|
最后在主进程中接收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| const { app, BrowserWindow, ipcMain } = require('electron') const path = require('path') const fs = require('fs')
function writeFile(_, data) { fs.writeFileSync('D:/hello.txt', data) }
function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, x: 0, y: 0, webPreferences: { preload: path.resolve(__dirname, './preload.js') } }) ipcMain.on('file-save', writeFile) win.loadFile('./src/index.html') }
app.on('ready', () => { console.log('be ready') createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) })
|
双向通信
读取D盘中刚写入的文件,为什么说是双向呢?
因为这个流程是
- 渲染进程通知主进程要读取哪个文件
- 主进程将读取出的文件内容传递给渲染进程
预加载脚本
1 2 3
| readFile() { return ipcRenderer.invoke('file-read') }
|
渲染进程
1 2 3 4
| btn3.onclick = async () => { let data = await myAPI.readFile() alert(data) }
|
主进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| const { app, BrowserWindow, ipcMain } = require('electron') const path = require('path') const fs = require('fs')
function writeFile(_, data) { fs.writeFileSync('D:/hello.txt', data) }
function readFile() { const res = fs.readFileSync('D:/hello.txt').toString() return res }
function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, x: 0, y: 0, webPreferences: { preload: path.resolve(__dirname, './preload.js') } }) ipcMain.on('file-save', writeFile) ipcMain.handle('file-read', readFile) win.loadFile('./src/index.html') }
app.on('ready', () => { console.log('be ready') createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) })
|
就实现了双向通信
另外一种由主进程传递给渲染进程的单向通信就不看了
打包
使用electron-builder
打包应用
首先安装electron-builder