新星计划 Electron+vue2 桌面应用 1 基础

/(ㄒoㄒ)/~~报名了两个新星计划,工作之余写博客……

另外一个是uniapp的属于个人兴趣,这个桌面应用正好符合工作需要。

活动地址:https://marketing.csdn.net/p/1738cda78d47b2ebb920916aab7c3584

教程地址:

2023新星导师活动【electron+vue3】方向,开营知识点提纲(1)_中二少年学编程的博客-CSDN博客

快速入门 | Electron

之前用uniapp做h5,再用Electron做确实编译出一个exe文件,但之后领导并没有把这个需求让我实现,嗯……所以并没有深入研究,这回也是简单学习下。

vue2文档地址:Vue.js

electron文档地址:简介 | Electron

 vue2有点基础,所以跳过。

1、Electron

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架,嵌入Chromium和Node.js。

开发时,本地必须安装Node.js。

Electron 将 Node.js 嵌入到其二进制文件中,应用运行时的 Node.js 版本与系统中运行的 Node.js 版本无关。

//创建应用
npm init
npm install --save-dev electron
//或者 npm install -g electron  全局安装
//运行
npm start
//编译 百度后的结果 试过之后确实编译成功 并可正常运行编译结果
electron-packager . 
    应用名 
    --platform=win32 
    --electron-version=10.0.0 
    --arch=x64 
    --download.mirrorOptions.mirror=https://npm.taobao.org/mirrors/electron/ 
    --asar 
    --app-version=0.0.0 
    --build-version=0.0.0 
    --out=输出文件名字 
    --overwrite 
    --no-package-manager 
    --ignore="(.git)" 
    --icon=ico图标文件

编译设置

https://npm.taobao.org/mirrors/electron/

是为了加快编译速度,electron-version要和上述网址中的内容对应,不然报错。

第一次编译的时候写成:electron-version=1.0.0,大概是报错这个版本找不到。

官方给的样例为:GitHub - electron/electron-quick-start: Clone to try a simple Electron app

2、Electron Forge

用过vue的大概都知道,vue的脚手架的使用方法,electron有个类似的electron forge。

Electron Forge 官网:Getting Started - Electron Forge

//安装 未安装的情况
cd 项目
npm install --save-dev @electron-forge/cli
npx electron-forge import
//安装依赖
npm install --save-dev @electron-forge/cli 
    @electron-forge/maker-squirrel 
    @electron-forge/maker-deb 
    @electron-forge/maker-zip
//创建项目
npm init electron-app@lastest myapp
//使用模板
npm init electron-app@lastest myapp2 
    --
    --template=webpack//可选 webpack 和 webpack-typescript
//启动
cd 项目名
npm start
//编译
npm run make

 

另外说一句,Node.js新版npm操作后直接写入package.json,--save这种写法貌似是针对旧版不写入package.json中。

官方建议做windows app的时候,建议安装electron-squirrel-startup。

//安装
cd my-app
npm install electron-squirrel-startup
//使用 mian.js中处理
if (require('electron-squirrel-startup')) 
app.quit();

官网上有其配置和cli的详细解说,都是纯英文的,/(ㄒoㄒ)/~~ 能力有限就不翻译了。

看官网教程,还贴心的具体指出nodejs的官方文档👍  :Introduction to Node.js

3、 预加载

Electron 的主进程是一个拥有着完全操作系统访问权限的 Node.js 环境,渲染进程跑在网页中,

为了将 Electron 的不同类型的进程桥接在一起,需要使用被称为 预加载 的特殊脚本。

preload.js为预加载脚本。

BrowserWindow 的预加载脚本运行在具有 HTML DOM 和 Node.js、Electron API 的有限子集访问权限的环境中。

从 Electron 20 开始,预加载脚本默认 沙盒化 ,不再拥有完整 Node.js 环境的访问权,意味着只拥有一个 polyfilled 的 require 函数,这个函数只能访问一组有限的 API。

//preload.js 内容
const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('versions', {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron,
  // 能暴露的不仅仅是函数,我们还可以暴露变量
})


//加载 main.js
const { app, BrowserWindow } = require('electron')
const path = require('path')

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
    },
  })

  win.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow()
})

 _dirname字符串指向当前正在执行的脚本的路径,上面应该是根路径。

path.join是Node.js提供的api:Path | Node.js v20.2.0 Documentation

4、进程间通信

既然是多进程嘛,就涉及进程之间通信问题。

IPC指进程之间通信,可以使用 Electron 的 ipcMain 模块和 ipcRenderer 模块来进行进程间通信

 为了从网页向主进程发送消息,使用 ipcMain.handle 设置一个主进程处理程序(handler),然后在预处理脚本中暴露一个被称为 ipcRenderer.invoke 的函数来触发该处理程序(handler)。

//preload.js 暴露函数
const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('versions', {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron,
  ping: () => ipcRenderer.invoke('ping'),
  // 能暴露的不仅仅是函数,我们还可以暴露变量
})


//main.js 函数定义
const { app, BrowserWindow, ipcMain } = require('electron')
const path = require('path')

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
    },
  })
  ipcMain.handle('ping', () => 'pong')
  win.loadFile('index.html')
}
app.whenReady().then(createWindow)

//index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    />
    <meta
      http-equiv="X-Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    />
    <title>来自 Electron 渲染器的问好!</title>
  </head>
  <body>
    <h1>来自 Electron 渲染器的问好!</h1>
    <p>👋</p>
    <p id="info"></p>
  </body>
  <script src="./renderer.js"></script>
</html>

//renderer.js 使用函数  index.html里包含并运行这个文件
const func = async () => {
  const response = await window.versions.ping()
  console.log(response) // 打印 'pong'
}

func()

根据上面例子,运行起来的话控制台应该打印pong。总体来讲,就是监听、注册、运行。

根据官网,暴露的时候使用ipcRenderer.invoke('ping'),而不直接暴露ipcRenderer,因为ipcRenderer直接暴露会导致渲染器能够直接向主进程发送任意的 IPC 信息,会使得其成为恶意代码最强有力的攻击媒介。

在主进程中设置监听器在主进程中需要保证加载完后运行。

官网专门讲进程通信:进程间通信 | Electron

根据上一行官网内容,发现还有其他方法做交互。

语境隔离(Context Isolation)意味着预加载脚本与渲染器的主要运行环境是隔离开来的,以避免泄漏任何具特权的 API 到您的网页内容代码中。我们將使用 contextBridge 模块来安全地实现交互。

//preload.js
const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('myAPI', {
  desktop: true,
})


//renderer.js
const func = async () => {
  console.log(window.myAPI)//打印{ desktop: true }
}
func()

官网解释utilityProcess为效率进程,用于主进程调用子进程,也有一套子进程通讯的api。

官网地址:

utilityProcess | Electron

MessagePortMain | Electron

// 主进程
const { port1, port2 } = new MessageChannelMain()
//utilityProcess.fork(子进程入口)
const child = utilityProcess.fork(path.join(__dirname, 'test.js'))
//postmessage 参数: 1、数据 2、MessagePortMain[] 数据可选 数据大概是端口
//根据文档第二个参数用于权限转移 数据大概是端口
//child大概是个MessagePortMain对象
child.postMessage({ message: 'hello' }, [port1])

// Child process
process.parentPort.once('message', (e) => {
  const [port] = e.ports
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计

本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先&#xff0c;给出数据触发存储的整体框架及功能模块划分。然后&#xff0c;简介 MIG 用户接口、设置及读写时序。最后&#xff0c;进行数据跨时钟域模块设计&#xff0c;内存…

【瑞萨RA系列FSP库开发】RASC+Keil的环境搭建

文章目录 一、获取资源包二、安装 Keil 软件、RA 芯片包和 RASC三、RASC 集成到 Keil四、使用 RASC 生成 Keil 工程五、通过 Keil 打开 RASC 的 FSP 配置器界面六、配置和编译 Keil 工程七、使用调试器下载程序 本节将介绍如何在Keil上开发瑞萨RA MCU &#xff08;如需了解 e2 …

百汇BCR:十个外汇交易常见问题解析

外汇交易是一种受到市场欢迎的投资方式&#xff0c;参与交易很容易&#xff0c;但想要盈利却很难。特别是一些细节问题容易被忽略&#xff0c;百汇BCR小编整理了十个外汇交易常见问题供有需要的投资者借鉴学习。 问题一、外汇开户需要哪些资料&#xff1f; 个人相关信息资料、…

20 KVM管理虚拟机-虚拟机生命周期示例

文章目录 20 KVM管理虚拟机-虚拟机生命周期示例20.1 创建虚拟机20.2 启动虚拟机20.3 重启虚拟机20.4 关闭虚拟机20.5 销毁虚拟机 20 KVM管理虚拟机-虚拟机生命周期示例 本节给出虚拟机生命周期管理相关命令的示例。 20.1 创建虚拟机 虚拟机XML配置文件为openEulerVM.xml # …

Windows批处理指令

前言 批处理文件&#xff08;batch file&#xff09;包含一系列 DOS 命令&#xff0c;通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务&#xff0c;而无需重复输入相同指令。编写批处理文件非常简单&#xff0c;但难点在于确保一切按顺序执行。编写严谨的批处…

使用mkdocs快速部署上线静态站点到Github

背景 mkdocs是一种方便地生成站点的工具&#xff0c;相比hugo、hexo等个人博客而言&#xff0c;mkdocs更加简便、轻量级&#xff0c;可以快速帮助部署上线类似个人技术本&#xff08;notebook&#xff0c;wiki&#xff09;之类的站点。并且支持默认支持站点内搜索&#xff0c;…

基于SSM的网上宠物店

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

网络基础进阶

1、交换机接口类型 Console口&#xff1a;也称为&#xff1a;串口接口&#xff0c;一般用于与PC连接&#xff0c;用于配置和监控交换机。百兆以太网接口&#xff1a;用于连接计算机和交换机之间的通信。Console到的网络接口&#xff1a;俗称交叉串口&#xff0c;是用于连接交换…

微信小程序xr-frame实现多光源效果

1.基础知识&#xff1a; 灯光 灯光组件Light用于给场景提供照明&#xff0c;也是阴影的核心。相机组件一般被代理到灯光元素XRLight中使用&#xff0c;其派生自XRNode&#xff0c;对应在xml中的标签为xr-light。 主光源以及参数 类型uniforms宏说明书写环境光颜色和亮度u_a…

2023年门店管理系统如何选?简单好用的门店管理系统有哪些?

开单收银效率低、商品管理混乱、记账对账耗时耗力还易出错...... 是我们在进行门店管理过程中常见的问题。 为了改善门店管理遇到的这几大问题&#xff0c;提高门店管理效率&#xff0c;越来越多的门店开始使用门店管理系统。 但如何选择简单实用、性价比高的门店管理系统&…

template和component自定义组件之间的区别

在小程序中自定义组件 component 方式和组件模板 template 2种方式实现页面组件化。 一、component自定义组件 1.概念 自定义组件是指可以被多个页面使用的组件&#xff0c;可以在小程序中多次复用。在开发中可以将一个页面中的代码和样式抽象出来&#xff0c;然后创建一个自定…

springboot缓存

1. 认识缓存 一级缓存 - 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质 - 使用缓存可以有效的减少低速数据读取过程的次数&#xff0c;提高系统性能 Service public class BookServiceImplCache implements BookService {Autowiredprivate BookDao book…

Java | 一分钟掌握定时任务 | 3 - 单机定时之Timer

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱原创&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 介绍 这个是个JDK远古时代的api了&#xff0c;据考证&#xff0c;可以追溯到…

(2)数码管

LED数码管:数码管是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成"8"字器件 51单片机是共阴极连接 74HC245这个芯片有什么作用呢&#xff1f;解&#xff1a;这个芯片被称之为双向数据缓冲器这个芯片的作用&#xff0c;用来进行数据缓冲(提高驱…

如何在 Python 开发环境中调用 ChatGPT 模型?

本文将演示在本地的 python 项目中调用 ChatGPT 模型 前言 作为一名程序员&#xff0c;在开发过程当中时常需要使用 ChatGPT 来完成一些任务&#xff0c;但总是使用网页交互模式去 Web 端访问 ChatGPT 是很麻烦的&#xff0c;这时候我们可以使用代码来调用 ChatGPT 模型&…

RHCSA之查看命令帮助手册

目录 RHCSA之查看命令帮助手册 查看命令类型 --- type Linux中对应的命令类型 帮助命令 help 命令 用法1 help 内部命令 用法2 命令 --help 命令的部分语法符号解析 man 命令 man命令用法 man的帮助级 man 命令帮助信息界面中的常用操作 man命令中帮助信息的结构以及意义…

公司招了一个腾讯拿30K的人,让我见识到了什么是天花板···

前言 人人都有大厂梦&#xff0c;对于软件测试人员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#…

NXP公司LPC21xx+热敏电阻实现温度检测

LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU&#xff0c;支持实时仿真和嵌入式跟踪&#xff0c;具有尺寸小&#xff0c;功耗低&#xff0c;多个32位定时器、单/双10位8通道ADC、10位DAC、PWM通道、47个GPIO线&#xff08;它们拥有多达9个边沿或电平触发的外部中断…

保密+完整+可用+安全,规避代码安全「马奇诺防线」,构建软件供应链整体安全

近日&#xff0c;在「江狐会」广州站上&#xff0c;极狐(GitLab) 高级解决方案架构师武让分享了如何通过三大阶段 四大要点&#xff0c;规避代码安全「马奇诺防线」&#xff0c;真正确保软件供应链安全。以下内容整理自本次演讲。Enjoy&#xff5e; 先跟大家分享一个故事 一战…

Cplex的数据类型结构及基本语法功能

本序列将会重开一门新的序列----数学求解器cplex,文章不做简单介绍&#xff0c;不灌水&#xff0c;直接给大家进行讲述如何上手实操&#xff0c;并有针对性的给出相应案例分析。 OPL编程 OPL是ILOG团队为运筹学专家量身定制的一种优化建模语言&#xff0c;语法相对简单&#x…