前言: 参考尚硅谷视频记录:b站尚硅谷视频-1小时上手electron

一、什么是electron?

是一款应用广泛的、跨平台的、桌面应用开发框架。

  • 应用广泛:很多桌面应用都是这个框架写的,例如腾讯qq、百度云
  • 跨平台:跨window、mac、Linux这三大系统

二、electron的进程

main.js主进程使用Node api跟各个页面之间双向通信(ipc),同时使用native api实现操作的兼容

比如:主进程发出执行a,要想window、mac、linux都能听懂,就需要native api翻译一下

三、搭建工程

可参考:快速入门 | Electron

1、安装node

Node官网下载安装即可,最好是最新的版本

2、初始化项目

package.json配置文件里会出现下图,注意:作者和描述是必填的

3、安装electron

npm install --save-dev electron
//或者
npm install electron -D

如果安装报错,可以试试用淘宝镜像来安

cnpm i electron

4、打印hello world

在package.json里添加运行指令

新建一个入口文件main.js,就可以测试下能否正常打印了

四、案例实战

可参考BrowserWindow | Electron

1、远程页面窗口

写一个可以展示远程页面的窗口

2、本地页面

新建个本地页面,然后在main.js里挂上去就好

const { app, BrowserWindow } = require('electron');

const createWindow = () => {
    const win = new BrowserWindow({
        width: 800,//窗口宽度
        height: 600,//窗口高度
        autoHideMenuBar: true,//隐藏默认菜单栏
    })
    win.loadFile('./pages/index/index.html')
}

app.on('ready', () => {
    createWindow()
})

备注:关于CSP的详细说明:MDN内容安全策略详解 、Electron安全策略规范

//可以解决安全策略警告问题,记得在html里加上
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">

3、多系统兼容窗口生命周期

因为关闭窗口操作,对于不同系统有不同的规则。

  • window和Linux,关闭所有窗口时会退出应用
  • macOS 应用通常即使在没有打开任何窗口的情况下也继续运行,并且在没有窗口可用的情况下激活应用时会打开新的窗口

所以需要配置以下代码

//window && linux
//若果是非macOs系统,页面全部关闭时就退出应用
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})
//macOs
//这里的whenReady写法和前面的on ready一样
app.whenReady().then(() => {
  createWindow()
  //当应用启动,且没有页面时,则打开一个新页面
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

4、热更新nodemon

每次保存后就自动热更新页面,配置如下:

//安装nodemon
cnpm i nodemon -D
//重写package.json里的start
  "scripts": {
    "start": "nodemon --exec electron ."
  },

添加一个nodemon文件

自此就可以利用nodemon,完成保存时刷新页面啦。

5、认识preload

什么是preload?还记得前面的electron进程图吗?preload(预加载文件)也就是主进程node和渲染进程(html+js+css页面)之间双向通信的那个ipc,是二者之间的桥梁

什么情况需要使用preload呢?

例如,render里需要访问process时,process是node主进程的参数,render渲染进程无法直接访问,就需要通过preload传递

主进程和预加载脚本通过webPreferences关联,而预加载进程通过设置类似全局参数把内容传给了渲染进程

注意:主进程和渲染进程是一对多的关系,主进程、预加载脚本、渲染进程依次加载

五、进程通信

1、渲染进程 => 主进程

借案例来理解,要求从渲染进程页面输入文字后,点击存入按钮,输入内容通过主进程存储到D盘

效果如下

添加代码如下

2、主进程 <=> 渲染进程

例如,渲染进程告知主进程要读取的指令,主进程将信息传递给渲染进程,实现了双向的沟通

效果如下:

参考上面的添加代码

render.js

const btn3 = document.getElementById("btn3")

btn3.onclick = async() => {
    //获取主进程传过来的文件信息
    const res = await myAPI.readFile()
    alert(res)
}

main.js

//读取文件
function readFile() {
    const res = fs.readFileSync("D:/hello.txt").toString()
    return res
}

//关键字关联preload读取操作
ipcMain.handle('file-read', readFile)

preload.js

readFile() {
        return ipcRenderer.invoke('file-read')
    }

3、主进程 => 渲染进程

类似于1

主进程,用win.webContens.send('信道','数据')发出数据

渲染进程,用ipcRender.on('信道','回调') 接收数据

//main.js
function createWindow(){
  win.webContents.sernd('message','你好吗?')
}


//preload.js
contextBrige.exposeInMainWorld('myApi',{
  getMessage:(callback) => {
      return ipcRender.on('message',callback);
  }
})

六、打包

方法一

失败了,视频中使用electron-builder打包

1、安装electron-builder

cnpm install electron-builder -D

2、添加builder配置

3、运行命令打包

npm run build

然后就打包失败了,原因是因为github访问失败

方法二

参考electron官网:打包您的应用程序 | Electron

npm install --save-dev @electron-forge/cli
npx electron-forge import
npm run make

打包后的文件,在根项目下的out文件夹里

七、框架

electron已经集成了框架,比如electron-vite,开箱即用支持react和vue,很方便

可以多多看下,并运用

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐