当前位置: 首页 > news >正文

NodeJs 桌面开发学习 electron.js (一)

今天开始学习NodeJs 关于 桌面应用的内容,长期目标是 React + electron 实现一个桌面应用。

今天先实现一个简单的目标,搭建一个Electron + ts 项目架构,并实现主业务线程 和前端渲染线程的交互

一、代码结构和配置

例子项目结构大致如下:

package.json

{"name": "electron-ts-demo","version": "1.0.0","main": "dist/main.js","scripts": {"build": "tsc && xcopy /y src\\renderer\\*.html dist\\renderer\\","watch": "tsc -w","start": "electron .","dev": "concurrently \"npm run watch\" \"npm run start\""},"devDependencies": {"concurrently": "^9.2.0","electron": "^37.3.0","typescript": "^5.3.2"},"dependencies": {}
}

这里用到一个concurrently 包 是实现多条命令并行执行的工具。

tsconfig.json

{"compilerOptions": {"target": "ES2020","module": "commonjs","sourceMap": true,"outDir": "dist","strict": true,"esModuleInterop": true,"skipLibCheck": true},"include": ["src/**/*"]
}

二、代码实现

preload.ts

预处理实现

import { contextBridge, ipcRenderer } from 'electron';contextBridge.exposeInMainWorld('electronAPI', {sendMessage: (message: string) => ipcRenderer.send('message-from-renderer', message),onReply: (callback: (response: string) => void) => ipcRenderer.on('message-reply', (event, response) => callback(response))
});

实现渲染线程(页面) 发送信息到 主线程,主返回信息到渲染线程 (通过回调的形式)

main.ts

import { app, BrowserWindow, ipcMain } from 'electron';
import path from 'path';let mainWindow: BrowserWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),contextIsolation: true}});mainWindow.loadFile('dist/renderer/index.html');ipcMain.on('message-from-renderer', (event, msg: string) => {console.log('Received:', msg);event.reply('message-reply', `Main process received: ${msg}`);});
}app.whenReady().then(() => {createWindow();//macBook 兼容app.on("activate", () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
});app.on("window-all-closed", () => {if (process.platform !== "darwin") {app.quit();}
});

上面实现了一个简单的生成一个窗口的例子。使用我们预先准备的preload.js预处理。

通过 ipcMain 监听 发生消息和返回回调。

index.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>Electron TS Demo</title><style>body {font-family: Arial;padding: 20px;}button {padding: 8px 16px;}</style></head><body><h1>Electron + TypeScript Demo</h1><button id="sendBtn">Send Message</button><div id="response"></div><script src="renderer.js"></script></body>
</html>

renderer.ts

const sendBtn = document.getElementById('sendBtn')!;
const responseDiv = document.getElementById('response')!;sendBtn.addEventListener('click', () => {console.log("sendBtn Click");window?.electronAPI.sendMessage('Hello from TypeScript');
});window?.electronAPI.onReply((response: string) => {console.log(response);responseDiv.textContent = response;
});

这里添加监听 给主线程发送消息,通过 window.electronAPI 预处理暴露到主页面的对象设置监听方法监听主线程 返回消息。

三、效果

http://www.dtcms.com/a/338172.html

相关文章:

  • 黑马java入门实战笔记
  • 【从0到1制作一块STM32开发板】8. PCB添加丝印
  • c++中的auto自动类型推导
  • JVM-类加载详情
  • Mysql——分库分表后id冲突解决方案(即分布式ID的生成方案)
  • 静态网站与动态网站的区别
  • MySQL分库分表实战指南
  • 电子电气架构 --- 软件开发数字化转型
  • Linux小白加油站,第三周周考
  • 永磁同步电机控制算法--转速环电流环超螺旋滑模控制器STASMC
  • 04 类型别名type + 检测数据类型(typeof+instanceof) + 空安全+剩余和展开(运算符 ...)简单类型和复杂类型 + 模块化
  • Maven依赖管理工具详细介绍
  • PowerShell定时检查日期执行Python脚本
  • 决策树的学习
  • 【EI会议征稿】2025第四届健康大数据与智能医疗国际会议(ICHIH 2025)
  • 基于STM32的电动车智能报警系统设计与实现
  • <数据集>遥感飞机识别数据集<目标检测>
  • rsync scp无法使用,踩坑破解之道!
  • 代理模式深度解析:从静态代理到 Spring AOP 实现
  • WAIC点燃人形机器人热潮,诠视SeerSense® DS80:多感融合的空间感知中枢,重新定义机器三维认知
  • 8月更新!Windows 10 22H2 64位 五合一版【原版+优化版、版本号:19045.6159】
  • 红日靶场01<超水版>
  • IDEA的创建与使用(2017版本)
  • 如何用企业微信AI 破解金融服务难题?
  • [Code Analysis] docs | Web应用前端
  • 深入解析:如何设计灵活且可维护的自定义消息机制
  • Spring AI + MCP Client 配置与使用详解
  • 专业高效的汽车部件FMEA解决方案--全星FMEA软件系统在汽车部件行业的应用优势
  • 百胜软件亮相CCDS2025-中国美妆数智科技峰会,解码美妆品牌数智化转型新路径
  • 【C语言16天强化训练】从基础入门到进阶:Day 2