Electron桌面应用开发笔记

admin 2025年3月12日17:06:04评论8 views字数 3782阅读12分36秒阅读模式

#好久没更新啦 骚瑞

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux

在我们进行桌面应用开发 的时候很需要这种框架 像我们目前常用的vscode、qq都是使用Electron开发的。Electron开发的主要知识点除了前端知识以为我认为比较重要的的就是进程通信 下午也会讲到相关的实现

chromium用于渲染页面 node.js用于后台操作  native用于操作osElectron桌面应用开发笔记

这是进程通信流程 当需要操作os的的时候就需要用到进程通信 例如通过前端向磁盘写入文件

Electron桌面应用开发笔记

进入项目文件并且初始化项目

cd TingHacknpm init

必填项

Electron桌面应用开发笔记

scripts需要修改

Electron桌面应用开发笔记

最终代码 package.json

{  "name": "tinghack",  "version": "1.0.0",  "main": "main.js",  "scripts": {    "start": "electron ."  },  "author": "Ting",  "license": "ISC",  "description": "TingHack"}

先设置镜像源然后 下载相关工具 之后编译器有了代码提示

npm config set electron_mirror https://npm.taobao.org/mirrors/electron/ npm install --save-dev electron

执行 以下代码就有ui了

npm start
Electron桌面应用开发笔记

配置自动重启 每次修改代码后自动执行npm start

npm i nodemon -D

修改package.json

  "scripts": {    "start": "nodemon --exec electron ."  },

新建nodemon.json 代码如下

{  "ignore":[    "node modules",    "dist"  ],  "restartable":"r",  "watch":["*.*"],  "ext":"html,js,css"}

主进程(main.js)如果需要与渲染进程进行通信需要一个中间的进程 即预加载进程 (preload.js)

三个进行执行顺序是 主进程 预加载进程 渲染渲染进程 ,其中预加载进行可以使用主进程从一些函数 方法

其中渲染进程向主进程通信

const {contextBridge, ipcRenderer} = require('electron')......ipcRenderer.send('file-save', data)const {app, BrowserWindow,ipcMain} = require('electron')......ipcMain.on('file-save', writeFile)

主进程 渲染进程双向通信

const {contextBridge, ipcRenderer} = require('electron')......async readFile() {    return await ipcRenderer.invoke('file-read')}const {app, BrowserWindow,ipcMain} = require('electron')......ipcMain.handle('file-read',readFile)

打包项目

npm install electron-builder -D

可自定义的设置项如下 

{  "name": "video-tools",  "version": "1.0.0",  "main": "main.js",  "scripts": {    "start": "electron .",    "build": "electron-builder"  },  "build": {    "appId": "com.atguigu.video",    "win": {      "icon": "./logo.ico",      "target": [        {          "target": "nsis",          "arch": ["x64"]        }      ]    },    "nsis": {      "oneClick": false,      "perMachine": true,      "allowToChangeInstallationDirectory": true    }  },  "devDependencies": {    "electron": "^30.0.0",    "electron-builder": "^24.13.3"  },  "author": "宝码香车",  "license": "ISC",  "description": "A video processing program based on Electron"}

不过纯写html css js的话可能没有vue那么好用 所以还是考虑结合vue来写ui 首先安装vue环境

npm create vue

输入项目文件名之后 cd进去 然后执行

npm install

然后修改package.json 以与electron的统一  type换成了commonjs

{  "name": "tinghack",  "version": "1.0.0",  "main": "main.js",  "author": "Ting",  "license": "ISC",  "description": "TingHack",  "type": "commonjs",

然后安装electron环境

npm add electron -D

装好之后我们要通过electron启动 配置script

  "scripts": {    "start": "electron .",    "dev": "vite",    "build": "vite build",    "preview": "vite preview"  },

然后创建一个main.js 跟之前的一样 这样就好了 可以写vue了

Electron桌面应用开发笔记
main.js代码如下 可自行
const {app, BrowserWindow,ipcMain} = require('electron')const path = require('path')const fs = require('fs')const { exec, spawn } = require('child_process');// 使用 exec 执行简单命令exec('dir'(error, stdout, stderr) => {if (error) {    console.error(`exec error: ${error}`);    return;    }    console.log(`stdout: ${stdout}`);    console.log(`stderr: ${stderr}`);});//写入文件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({        width800,        height600,        autoHideMenuBartrue,        webPreferences: {            preload:path.resolve(__dirname,'./preload.js')        }    })    ipcMain.on('file-save', writeFile)    ipcMain.handle('file-read',readFile)}app.on('ready'() => {    createWindow()    app.on('activate',()=> {        if (BrowserWindow.getAllWindows().length === 0createWindow()    })})app.on('window-all-closed'() => {    if (process.platform !== 'darwin') app.quit()})
preload.js代码如下
const {contextBridge, ipcRenderer} = require('electron')contextBridge.exposeInMainWorld('myAPI', {    version: process.version,    saveFile(data) => {        ipcRenderer.send('file-save', data)    },   async readFile() {        return await ipcRenderer.invoke('file-read')    }})
前端可自行完善

原文始发于微信公众号(Ting的安全笔记):Electron桌面应用开发笔记

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月12日17:06:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Electron桌面应用开发笔记https://cn-sec.com/archives/3832931.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息