Puppeter与Electron的结合,使用Electron创建可视化界面

news2024/11/26 18:32:50

前言

上一篇文章:Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本,简单介绍了Puppeteer的基本使用,以及如何编写一个脚本。

但是呢脚本的运行需要在node环境里,开发人员可能没什么问题。但是如果你写的这个脚本要给非开发人员使用呢?那么能不能做一个可视化的界面呢?

这时候想起了Electron,Electron可以用于构建桌面程序,而且嵌入了ChromeiumNode.js,这不是刚刚好吗
在这里插入图片描述

Electron文档
https://www.electronjs.org/

Puppeter文档
https://puppeteer.bootcss.com/

准备

搭建一个Electron项目

现在搭建项目更加的方便了,可以直接使用Vite提供的模板。看个人的选择,我这里选择

electron-vite-vue - Electron + Vite + Vue template.

模板比较简介,方便我这样刚入门的使用。当然也可以多下载几个模板,看看效果,把优点整合一下,开发一个适合子级的模板。

模板选择

在这里插入图片描述
项目下载下来后,安装依赖并运行,常用的依赖都已经安装好了,还是很不错的

# 安装依赖
npm install
# 运行
npm run dev
# 打包
npm run build

运行效果
在这里插入图片描述
安装依赖

安装一下element-plusaxiosvue-router 方便后续的开发使用

npm install element-plus  vue-router axios pinia  --save

修改配置文件

main.ts

import { createApp } from 'vue'
import "./style.css"
import App from './App.vue'
import './samples/node-api'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { createPinia } from 'pinia'
import router from './router'

const app = createApp(App)
const store = createPinia()

app
  .use(ElementPlus)
  .use(store)
  .use(router)
  .mount('#app')
  .$nextTick(() => {
    postMessage({ payload: 'removeLoading' }, '*')
  })

修改后

在这里插入图片描述
安装puppeteer

npm install puppeteer.11.1

通信

vue里面是无法直接调用脚本的,需要在vue组件里向Electron发送消息,Electron接收到消息后执行相应的命令。

现在我们看一下electron这个目录,electon/main这个目录存放的是主进程,electon/preload这个目录放的是预加载脚本

主进程
主进程是Electron应用程序的主要进程,负责创建和控制所有的渲染进程和窗口。它是运行在Node.js环境中的一个进程,可以使用Electron提供的API来访问底层操作系统功能。主进程负责管理应用程序的生命周期、处理系统级的事件、创建和销毁渲染进程等。
主进程通常是通过一个JavaScript文件(通常命名为main.js)来定义和创建的。在主进程中,你可以使用Electron提供的API,如创建窗口、访问操作系统资源、处理系统级的事件等。

预加载脚本

预加载脚本是在渲染进程运行之前被加载和执行的脚本。它可以在渲染进程中访问Node.js的API,这样你就可以在渲染进程中使用一些Electron提供的API,而无需通过与主进程进行通信。预加载脚本在渲染进程创建之前被注入,可以在创建Web页面时通过preload选项指定。
预加载脚本通常用于在渲染进程中执行一些需要使用Node.js API的操作,例如访问文件系统、操作数据库等。它可以在渲染进程中提供一些额外的功能和权限。

需要注意的是,预加载脚本运行在渲染进程的沙箱环境中,它们与主进程是隔离的,因此应该谨慎处理涉及安全性和权限的操作。

vue与electron之间的通信

vue向electron通信

首先,在你的Vue组件中,使用Electron提供的remote模块获取当前渲染进程的BrowserWindow实例对象,然后使用这个对象来给主进程发送消息。示例代码如下:

// 导入ipcRenderer模块
const { ipcRenderer } = window.require('electron')
// 向Electron主进程发送消息
ipcRenderer.send('toMain', 'message content')

然后,在你的Electron主进程中监听toMain事件,当接收到该事件时执行相应的脚本。示例代码如下:

import { ipcMain } from 'electron'
// 监听toMain事件
ipcMain.on('toMain', (event, message) => {
  // 执行相应的脚本
})

electron向vue通信

vue组件监听消息

// 导入ipcRenderer模块
const { ipcRenderer } = window.require('electron')

// 监听来自Electron主进程的消息
ipcRenderer.on('fromMain', (event, message) => {
  // 处理从Electron主进程接收到的消息
})

electron发送消息

import { ipcMain } from 'electron'

// 监听来自Vue组件的消息
ipcMain.on('toMain', (event, message) => {
  // 执行相应的脚本

  // 获取所有打开的窗口
  const windows = BrowserWindow.getAllWindows()
  // 向所有窗口广播消息
  windows.forEach(window => {
    window.webContents.send('fromMain', 'response content')
  })
})

在这里插入图片描述

electron与node脚本之间的通信

比如我要使用node脚本下载图片,需要electron向node脚本发消息,告诉下载后的这个图片叫什么名字吧。node脚本下载完图片是不是要向electron说一声我已经下载完图片了。

这里需要用到child_process模块,child_process模块提供了几个方法来创建子进程:execspawnfork。这些方法在以下方面有所不同:

  1. exec方法:exec方法用于执行命令并获取其输出。它创建一个shell,并在该shell中执行指定的命令。当命令执行完成后,它提供了回调函数来获取命令的输出结果。这个方法适用于需要执行简单命令和获取其输出的情况。

  2. spawn方法:spawn方法用于创建一个新的进程,并通过流的方式与其进行通信。它可以执行复杂的命令,并提供了标准输入、标准输出和标准错误流的实时数据传输。这个方法适用于需要与子进程进行实时交互的情况。

  3. fork方法:fork方法是spawn方法的一个特殊形式,用于创建一个新的Node.js进程。它可以在子进程中执行Node.js模块,并通过IPC(进程间通信)通道与父进程进行通信。这个方法适用于需要创建独立的Node.js进程,以便并行处理任务的情况。

总结一下:

  • exec用于执行简单的命令并获取其输出结果。
  • spawn用于创建子进程并通过流与其进行实时通信。
  • fork用于创建独立的Node.js进程,并通过IPC与父进程进行通信。

前两个没有用到,因此没怎么研究,感兴趣的自行百度,这里主要说一下第三个fork

electron端

const { fork } = require('child_process');

// 创建子进程
const child = fork('child.js');
// 向子进程发送消息
child.send('Hello from main');

// 这是创建的窗口界面的对象
const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true // 允许在渲染进程中使用 Node.js API
    }
 });


// 监听子进程的消息
child.on('message', (msg) => {
   mainWindow.webContents.send('message-from-child', msg); // 向渲染进程发送消息
});

补充:

1、创建子进程的过程就会同时执行你的node脚本
2、 创建子进程时可以传递参数

// 创建子进程,并指定命令行参数和环境变量
const child = fork('child.js', ['arg1', 'arg2'], { env: { NODE_ENV: 'production' } });

子进程(你的脚本)

const { ipcMain } = require('electron');

// 监听主进程发送的消息
ipcMain.on('message-from-renderer', (event, msg) => {
  console.log('Received message from renderer:', msg);
});

// 向主进程发送消息,也可以发送对象
process.send('Hello from child');

补充:

子进程可以通过 process.argv 属性获取到在启动子进程时传递的命令行参数。process.argv 是一个数组,包含了在启动 Node.js 进程时传递的所有命令行参数

console.log(process.argv); // 打印所有命令行参数
console.log(process.argv[0]); // 打印 Node.js 可执行文件路径
console.log(process.argv[1]); // 打印被执行的 JavaScript 文件路径
console.log(process.argv.slice(2)); // 打印用户传递的命令行参数

vue与node脚本间的通信

上面我们介绍的通信,都需要用到主进程,主进程相当于一个中转站的角色。那么能不能直接在vue组件里与node脚本进行通信,查了一下也是可以的,比如借助spawn

const { spawn } = require('child_process');import { spawn } from 'child_process';

但是我不建议使用这种方式,因此也不打算深入研究了。

通过主进程的方式进行通信,可以保证所有的通信都能在主进程里找到,出现问题可以方便排查。可以设置公共的通信,通过传参来执行不同的脚本。

但是如果让vue组件直接与node脚本进行通信,如果组件少还可以。如果组件多了,一起开发的人多了很容易出现各种各样的问题。就比如我定义了一个a消息是用来下载图片的,另一个人定义了b来下载图片,可能还有c、d什么的,这样很容易导致项目变得越来越烂。

消息类型

以下是我结合gpt,已经自己应用总结的,不一定正确,如果有错误之处麻烦指出。

  • 主进程与渲染进程之间的通信,消息类型类型可以自定义,只需要保证双方一致

主进程

import { app, BrowserWindow, shell, ipcMain } from 'electron'

// 监听toMain事件
ipcMain.on('toMain', (event, message) => {
  console.log("toMain事件:", event, message)
  // 获取所有打开的窗口
  const windows = BrowserWindow.getAllWindows()
  const date = new Date().toLocaleDateString()
  // 向所有窗口广播消息
  windows.forEach(window => {
    window.webContents.send('fromMain', date)
  })
})

渲染进程

const { ipcRenderer } = window.require('electron')

// 监听从Electron主进程接收到的消息
ipcRenderer.on('fromMain', (event, message) => {
    console.log("fromMain", event, message)
    date.value = message
})

// 向Electron主进程发送消息
ipcRenderer.send('toMain', 'message content')
  • 主进程与子进程(node脚本)进行通信

主进程

const { fork } = require('child_process');

// 创建子进程,filePath是脚本路径
const child = fork(filePath,['screenshot_0.png']);
// 监听子进程的消息
child.on('message', (data) => {
    console.log("success:",data)
})

messagechild_process模块中的一个固定的事件名称,用于接收子进程发送的消息。它是一个内置的事件,用于监听子进程发送的任何类型的消息。子进程可以通过发送对象,主进程根据对象的属性值来区分消息类型

脚本

const message = {
    type: "download",
    status: "success",
    path: path.join(
      process.env.DIST_ELECTRON,
      `../puppeteer-download/${process.argv[2]}`
    ),
  };
  process.send(message);

执行脚本

代码就不放了,效果图如下:
请添加图片描述
这里在打包时遇到了一些问题

问题1:如下图,原因是Nullish Coalescing Assignment (??=) 是在 ECMAScript 2021 中引入的,并且需要 Node.js 15.0.0 或更高版本才能支持。需要确保你的 Node.js 版本高于 15.0.0
在这里插入图片描述
问题2:如下图,原因是从github下载文件时出错了,很好理解,国内访问github经常访问不了。
在这里插入图片描述
除了这个文件还有其他几个文件,可以将下载地址复制到浏览器里下载下来。
我这里总共下载了三个文件,分别是:winCodeSign-2.6.0.7znsis-3.0.4.1.7znsis-resources-3.4.1.7z 需要将这3个文件解压到对应的文件目录里(路径不一定一样,但是基本上是c盘,找到electron-builder 文件夹)
分别是:
在这里插入图片描述在这里插入图片描述

再次执行打包,打包成功如下:
在这里插入图片描述
在这里插入图片描述

打包需要的配置文件已经项目demo下载地址:
链接:https://pan.baidu.com/s/12EnVdQNB7bwqDACLISEUcw
提取码:1234

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aspose转pdf乱码问题

一、问题描述 ​ 在centos服务器使用aspose.word转换word文件为pdf的时候显示中文乱码(如图),但是在win服务器上使用可以正常转换 二、问题原因 由于linux服务器缺少对应的字库导致文件转换出现乱码的 三、解决方式 1.将window中字体(c:\windows\fonts)放到linux…

软件过程能力成熟度评估——CSMM认证

CSMM认证又称为“软件过程能力过程成熟度评估”,由中国电子技术标准化研究院联合五十余家产学研用相关方结合我国实际,自主制定的团体标准,于2021年6月8号发布,目的是为了帮助国内软件企业对自身的软件能力进行评估和判断&#xf…

Redis实战(10)-一条命令在Redis是如何执行的?

Redis Server一旦和某客户端建立连接,就会在事件驱动框架中注册可读事件,对应客户端的命令请求。 整个命令处理过程可分阶段: 命令解析,processInputBufferAndReplicate命令执行,processCommand结果返回,…

APEX:开启Android系统新篇章的应用扁平化技术

APEX:开启Android系统新篇章的应用扁平化技术 Android Pony Express (APEX) 是在 Android Q 中引入的一种容器格式,用于安装流程中较低级系统模块的更新。该格式方便了系统组件的更新,这些组件不适合标准的 Android 应用程序模型。一些示例组…

计算机系大学生,可以通过Java做什么副业?这篇文章给你答案!

文章目录 前言发现副业机会提高效率面向人群 如何开启自己的副业价格优势需要课设的人多吗怎么宣传生成器的使用 生成器介绍安装功能介绍文档查询功能生成的JavaWeb系统示例生成的C#生成的Javaswing生成的VueER图 、UML、功能图..生成的C、C系统 前言 计算机系科班出身的学生&a…

轻量服务器2核与1核的区别

​ 1.核心数量 轻量服务器2核与1核最明显的区别在于核心数量。1核服务器只有一个处理器核心,而2核服务器有两个处理器核心。这使得2核服务器在处理数据时能够同时执行更多的任务。 2.并行处理能力 由于只有1个核心,1核服务器不具备并行处理任务的能力。而…

天津专升本文化课考试计算机应用基础考试大纲(2023年9月修订)

天津市高等院校“高职升本科”招生统一考试计算机应用基础考试大纲(2023年9月修订) 一、考试性质 天津市高等院校“高职升本科”招生统一考试是由合格的高职高专毕业生参加的选拔性 考试。高等院校根据考生的成绩,按照已确定的招生计划&am…

低功耗蓝牙物联网:未来连接的无限可能

物联网是连接各种设备和传感器的网络,其目的是实现信息的交换和共享,提高效率并优化生活。在这个领域,低功耗蓝牙(BLE)正在发挥着越来越重要的作用。 低功耗蓝牙是一种无线通信技术,它的主要特点是低功耗和…

HarmonyOS之 组件的使用

一 容器 1.1 容器分类 Column表示沿垂直方向布局的容器。Row表示沿水平方向布局的容器。 1.2 主轴和交叉轴 主轴:在Column容器中的子组件是按照从上到下的垂直方向布局的,其主轴的方向是垂直方向;在Row容器中的组件是按照从左到右的水平方向…

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布,相信很多同学都已经抢先使用了起来,甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性,新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线…

编译vtk源码

vtk和opengl关系 VTK(Visualization Toolkit)和OpenGL(Open Graphics Library)都是用于图形可视化和渲染的重要工具,但它们在图形编程中的角色和关系略有不同。 OpenGL: OpenGL是一种开放的图形库和API&a…

uniapp自定义播放器

问题描述:我是真无语啊,就是有一个目录切换的地方,然后切换音频,结果你猜怎么着,嘿,音频他不播放了。也就是下面这个方法都不进去了打印的时候,音频播放都播放不了了,我尝试了销毁在…

前端提交规范 ESLint + Prettier + husky + lint-staged

如何统一代码风格,规范提交呢? 推荐使用前端规范全家桶 ESLint Prettier husky lint-staged。 eslint (github.com/eslint/esli…)JavaScript 代码检测工具,检测并提示错误或警告信息prettier (github.com/prettier/pr…) 代码自动化格式…

【面试题】Js数组去重都有哪些方法?

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 1. indexOf 定义: indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置…

基于SSM的田径运动会成绩管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

秒懂生成式AI—大语言模型是如何生成内容的?

备受关注的大语言模型,核心是自然语言的理解与文本内容的生成,对于此,你是否好奇过它们究竟是如何理解自然语言并生成内容的,其工作原理又是什么呢? 要想了解这个,我们就不得不先跳出大语言模型的领域&…

Hadoop初识及信息安全(大数据的分布式存储和计算平台)

目录 什么是Hadoop Hadoop的特点 Hadoop优点 Hadoop的缺点 Hadoop的重要组成 信息安全 什么是Hadoop Hadoop 是一个适合大数据的分布式存储和计算平台。 Hadoop的广义和狭义区分: 狭义的Hadoop:指的是一个框架,Hadoop是由三部分组成:H…

做测试半年,我已经掉了4个坑……

从事软件测试工作已经半年多了,刚入职的时候还是一个缺乏实际经验的小白,而现在拿到需求之后也能比较快速地熟悉业务并顺利开展测试,虽然不能说掌握了很多技能,但是相比之前也是有不少收获的,在这个过程中我总结了一点…

使用vue-cli搭建SPA项目

一.SPA项目的构建 前提 nodeJS环境已经搭建完毕 node -v npm -v 什么是SPA项目 SPA(Single Page Application)项目是一种使用单页面架构的Web应用项目。在SPA项目中,整个应用程序只有一个HTML页面,通过动态加载数据和更新DOM来实…

计算机竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数:2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…