electron
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入了Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。
主进程
每个 Electron 应用都有一个单一的主进程,作为应用程序的入口点。主进程直接在nodejs中运行,所以可以直接使用nodejs的能力。
窗口
主要目的是使用 BrowserWindow 模块创建和管理应用程序窗口。(渲染进程)
BrowserWindow 类的每个实例创建一个应用程序窗口,且在单独的渲染器进程中加载一个网页。
使用方式:
const{BrowserWindow}=require('electron')
const win = new BrowserWindow({width:800,height:1500})
win.loadURL('https://github.com')
const contents = win.webContents
渲染进程
每个 Electron 应用都会为每个打开的 BrowserWindow ( 与每个网页嵌入 ) 生成一个单独的渲染器进程。 洽如其名,渲染器负责 渲染 网页内容。
在渲染器进程中无法直接使用node.js的能力。
preload脚本
预加载(preload)脚本包含了那些执行于渲染器进程中,且先于网页内容开始加载的代码 。 这些脚本虽运行于渲染器的环境中,却因能访问 Node.js API 而拥有了更多的权限。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({
webPreferences: {
preload: 'path/to/preload.js'
}
})
因为预加载脚本与浏览器共享同一个全局 Window 接口,并且可以访问 Node.js API,所以它通过在全局 window 中暴露任意 API 来增强渲染器,以便你的网页内容使用。
为什么会有preload的存在?
使用preload的目的是在electron中不开启node环境集成情况下使用node的模块,避免不安全的JavaScript代码随意使用node环境。
单向数据通讯场景,例如:动态修改窗口标题,调用打印服务等不需要回调的事件
双向数据通讯场景,例如:选择文件后的回调
总结:
1.一体机项目是基于vue-cli 脚手架创建的uniapp 的 vue2.x版本。
2.通过electron主进程获取一体机硬件信息。
问题:大概率情况下第二次打开electron应用,无法获取推送的硬件信息。
分析:通过electron主进程主动推送硬件信息到渲染进程的方案,可能是退出的时候慢,进程没有彻底杀死,导致应用只能在第一次触发消息推送,之后再次打开项目无法主动推送。
改进: 修改为在渲染进程中主动去获取硬件信息。通过vue的生命周期函数去控制获取硬件信息的时机。
3.在项目中使用 vue add electron-builder 命令添加electron的依赖,具体操作看这篇文档。
基于electron进程与打印机进行通讯并打印使用了pdf-to-printer库,此库依赖 SumatraPDF-3.4.6-32.exe,官网下载之后,放到项目中的 build 文件夹中,修改通过vue.config.js配置,在打包的时候把exe文件放到打包后的项目中。
module.exports = {
pluginOptions: {
electronBuilder:{
builderOptions: {
extraResources:{
{
from: "build/SumatraPDF-3.4.6-32.exe",
to: "app.asar.unpacked/SumatraPDF-3.4.6-32.exe",
},
}
}
}
}
}
4.electron项目打开后的一些默认操作
1.默认全屏
const win = new BrowserWindow({
width: 800,
height: 600,
menuBarVisible: true, //隐藏菜单状态栏
focusable: true, //窗口是否可以聚焦
frame: false, //是否显示窗口边框
fullScreen: true, //是否全屏
kiosk:true, // 是否展台模式
})
2.在桌面的最前端
win.focus(); // 选中当前窗口
win.setAlwaysOnTop(true); //设置窗口置顶
3.允许触摸事件以及touch事件
win.webContents.debugger.attach("1.3");
win.webContents.debugger.sendCommand("Emulation.setTouchEmulationEnabled", {
enabled: true,
configuration: "mobile",
});
win.webContents.debugger.sendCommand("Emulation.setEmitTouchEventsForMouse", {
enabled: true,
});
4.electron应用自动更新(暂无)